1269. 停在原地的方案数

115 阅读1分钟

这是我参与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)转移而来

  1. 上一步(i-1步)就是在当前j位置不动,所以dp[i][j]=dp[i-1][j];
  2. 上一步(i-1步)就是在当前j位置的左边(j-1),所以dp[i][j]=(dp[i][j]+dp[i-1][j-1])%m;
  3. 上一步(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];
    }
}