https://leetcode-cn.com/problems/number-of-ways-to-stay-in-the-same-place-after-some-steps/
思路:
d
p
i
,
j
dp_{i,j}
dpi,j表示经过
i
i
i步后到达
j
j
j位置的方法数,显然
d
p
0
,
0
=
1
dp_{0,0}=1
dp0,0=1,且有以下转移方程:
d
p
i
,
j
=
d
p
i
−
1
,
j
−
1
+
d
p
i
−
1
,
j
+
d
p
i
−
1
,
j
+
1
dp_{i,j}=dp_{i-1,j-1}+dp_{i-1,j}+dp_{i-1,j+1}
dpi,j=dpi−1,j−1+dpi−1,j+dpi−1,j+1
注意取模和位置的有效性即可。
class Solution {
public:
int numWays(int steps, int arrLen) {
vector<vector<int>> dp(steps+1,vector<int>(steps+1));
dp[0][0]=1;
const int mod=1e9+7;
for(int i=1;i<=steps;i++)
{
int maxj=min(i,arrLen-1);
for(int j=0;j<=maxj;j++)
{
if(j-1>=0)
dp[i][j]=(dp[i-1][j-1]+dp[i][j])%mod;
if(j<maxj)
dp[i][j]=(dp[i-1][j+1]+dp[i][j])%mod;
dp[i][j]=(dp[i-1][j]+dp[i][j])%mod;
}
}
return dp[steps][0];
}
};