思路
定义dp[i][j] 是走了i步停在j处的方案数
优化1
一个重要的优化 是 lenmax = min(steps/2+1,arrLen);
要想回到0的话j的范围实际上是 取 上述的表达式的 由于arrlen的数量级>>steps 所以可以得到优化
优化2
//空间优化 保留两行
class Solution {
public:
int mod=1e9+7;
int numWays(int steps, int arrLen) {
int lenmax = min(steps/2+1,arrLen);
//lenmax++;
vector<vector<int>> dp(2,vector<int>(lenmax,0));
//空间优化 保留两行
//dp[i][j] 走了i步停在j处的方案数
dp[0][0]=1;
int last=0;
int now=1;
for(int i=1;i<=steps;i++){
for(int j=0;j<lenmax;j++){
int tsum=0;
if(j-1>=0){
tsum=(tsum+dp[last][j-1])%mod;
}
if(j+1<lenmax){
tsum=(tsum+dp[last][j+1])%mod;
}
tsum=(tsum+dp[last][j])%mod;
dp[now][j]=tsum;
if(i==steps && j==0){
return dp[now][j];
}
}
now=(now==1)?0:1;
last=(last==1)?0:1;
}
return dp[1][0];
}
};