LeetCode 1269. 停在原地的方案数 (Java 记忆化,动态规划)
Posted 醉苼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1269. 停在原地的方案数 (Java 记忆化,动态规划)相关的知识,希望对你有一定的参考价值。
Java 记忆化,动态规划
回溯+记忆化
class Solution {
private final int m = 1000000007;
//map用来记录
private Map<String, Integer> map = new HashMap<String, Integer>();
public int numWays(int steps, int arrLen) {
return dfs(steps,arrLen,0);
}
/**
*
* @param steps 剩余步数
* @param arrLen 数组长度
* @param index 当前下标
* @return
*/
public int dfs(int steps, int arrLen, int index) {
if(steps == 0) {
return index == 0 ? 1 : 0;
}
//如果下标比步数大,那么就不能回到原点了,直接返回0
if(steps < index) return 0;
String s = ""+steps+","+index;
//如果之前已经有记录了,直接返回
if(map.containsKey(s)) return map.get(s);
//原地不动的情况
int count = dfs(steps-1,arrLen,index);
count %= m;
//向左跳一步的情况,记得取模
if(index > 0) {
count += dfs(steps-1, arrLen, index-1);
count %= m;
}
//向右跳一步
if(index < arrLen-1) {
count += dfs(steps-1, arrLen, index+1);
count %= m;
}
//map记录
map.put(s, count);
return count;
}
}
动态规划
class Solution {
public int numWays(int steps, int arrLen) {
int m = 1000000007;
int len = Math.min(arrLen, steps);
//dp[i][j]表示剩i步时下标为j的方案数
int[][] dp = new int[steps+1][len+1];
//初始化
dp[0][0] = 1;
for(int i = 1; i <= steps; i++) {
for(int j = 0; j < len && j <= i; j++) {
dp[i][j] = dp[i-1][j];
if(j > 0) {
dp[i][j] += dp[i-1][j-1];
dp[i][j] %= m;
}
if(j < arrLen-1) {
dp[i][j] += dp[i-1][j+1];
dp[i][j] %= m;
}
}
}
return dp[steps][0];
}
}
以上是关于LeetCode 1269. 停在原地的方案数 (Java 记忆化,动态规划)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1269. 停在原地的方案数 (Java 记忆化,动态规划)
LeetCode 1269. 停在原地的方案数 (Java 记忆化,动态规划)