这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
1269. 停在原地的方案数
示例 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;
- 由于指针不能移动到数组范围外,因此对于上述状态转移方程,需要注意下标边界情况
- 算过程中需要对每个状态的值计算模 10^9+7后的结果。最终得到dp[steps][0] 的值即为答案
初始化
刚开始时在第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];
}
}