示例 1:
输入:steps = 3, arrLen = 2
输出:4
解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。
向右,向左,不动
不动,向右,向左
向右,不动,向左
不动,不动,不动
示例 2:
输入:steps = 2, arrLen = 4
输出:2
解释:2 步后,总共有 2 种不同的方法可以停在索引 0 处。
向右,向左
不动,不动
解题思路
数组含义
dp[i][j]代表第i步走到第j个下标的方法数量
状态转移
dp[i][j]=dp[i-1][j];if(j-1>=0)dp[i][j]=(dp[i][j]+dp[i-1][j-1])%m;if(j+1<=maxL) dp[i][j]=(dp[i][j]+dp[i-1][j+1])%m;
要达到第i步走到第j个下标这个状态,要从上一步(i-1)的三种位置(j+1,j-1,j)转移而来
- 上一步(i-1步)就是在当前j位置不动,所以dp[i][j]=dp[i-1][j];
- 上一步(i-1步)就是在当前j位置的左边(j-1),所以dp[i][j]=(dp[i][j]+dp[i-1][j-1])%m;
- 上一步(i-1步)就是在当前j位置的右边(j-1),所以dp[i][j]=(dp[i][j]+dp[i-1][j+1])%m;
初始化
刚开始时在第0个下标,步数是0,所以方法数只有1(dp[0][0]=1
)
代码
class Solution {public int numWays(int steps, int arrLen) {int m=(int)1e9+7;int maxL= Math.min(arrLen-1,steps/2);int[][] dp = new int[steps + 1][maxL+1];;for (int i=1;i<=steps;i++){for (int j=0;j<=maxL;j++){dp[i][j]=dp[i-1][j];if(j-1>=0)dp[i][j]=(dp[i][j]+dp[i-1][j-1])%m;if(j+1<=maxL) dp[i][j]=(dp[i][j]+dp[i-1][j+1])%m;}}return dp[steps][0];}
}