思路
动态规划
dp[i][j]表示第i步,第j个位置的方案
如果在最左边,只有原地和从右边移的
如果在最右边,只有原地和从左边移的
程序
class Solution {
public:
static constexpr int M = 1e9 + 7;
int numWays(int steps, int arrLen) {
//最远能到的位置就是steps / 2或者arrLen - 1
int max = min(steps / 2, arrLen - 1);
//经过i步在j的位置
vector<vector<int>> dp(steps + 1, vector<int>(max + 1));
dp[0][0] = 1;
for(int i = 1; i <= steps; i++){//从最远的地方开始
for(int j = 0; j <= max; j++){
dp[i][j] = dp[i - 1][j] % M;//原地
if(j >= 1) dp[i][j] = (dp[i][j] + dp[i - 1][j - 1]) % M;//不在最左边,加上从左边过来的
if(j <= max - 1) dp[i][j] = (dp[i][j] + dp[i - 1][j + 1]) % M;//不在最右边,加上从右边移过来的
}
}
return dp[steps][0];//最后一步在原点
}
};