示例 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];}
}