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-164周赛-1269-停在原地的方案数

leetcode1269. 停在原地的方案数简单DP

LeetCode 1269. 停在原地的方案数 (Java 记忆化,动态规划)

LeetCode 1269. 停在原地的方案数 (Java 记忆化,动态规划)

我用java刷 leetcode 1269. 停在原地的方案数

LeetCode 1269 停在原地的方案数[动态规划] HERODING的LeetCode之路