[每日一题]2400.恰好移动 k 步到达某一位置的方法数目

2400. 恰好移动 k 步到达某一位置的方法数目 给你两个 正 整数 startPos 和 endPos 。最初,你站在 无限 数轴上位置 startPos 处。在一步移动中,你可以向左或者向右移动一个位置。

给你一个正整数 k ,返回从 startPos 出发、恰好 移动 k 步并到达 endPos 的 不同 方法数目。由于答案可能会很大,返回对 10 9 + 7 取余 的结果。

如果所执行移动的顺序不完全相同,则认为两种方法不同。

注意:数轴包含负整数。

输入:startPos = 1, endPos = 2, k = 3 输出:3 解释:存在 3 种从 1 到 2 且恰好移动 3 步的方法:

  • 1 -> 2 -> 3 -> 2.
  • 1 -> 2 -> 1 -> 2.
  • 1 -> 0 -> 1 -> 2. 可以证明不存在其他方法,所以返回 3 。

输入:startPos = 2, endPos = 5, k = 10 输出:0 解释:不存在从 2 到 5 且恰好移动 10 步的方法。

提示:

  • 1 <= startPos, endPos, k <= 1000

Solution

class Solution {
    public int numberOfWays(int startPos, int endPos, int k) {
        int dis=endPos-startPos;
        int MOD=1000000007;
        if(dis>k||(k+dis)%2!=0) return 0;
        int [][] dp=new int [k+1][k+1];
        for(int i=0;i<=k;i++){
            dp[i][0]=1;
            for(int j=1;j<=i;j++){
                dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%MOD;
            }
        }
        return dp[k][(k+dis)/2];
    }
}

Ideas

动态规划:

dp[step][idx] 表示能走step步的情况下,从出发点(1001)到idx有多少种走法 我们要求的就是 dp[k][e]