题:
思+码:
public int numWays(int steps, int arrLen) {
int sum = 0; // sum最后的值至少为1,因为可以选择全不动
/*
每次可以选择 向右、不动、向左
相当于背包问题,每次选择一项相当于背包容量-1
向右导致value+1 向左导致value-1 不动的话value不变
初始value为0,要保证经过steps操作后value为0,否则不计入总数
value不能小于0,不能大于arrlen
dp[i][j]表示经过i次操作后,停留在j点的方案数
我们最后返回dp[steps][0]
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] + dp[i-1][j];
初始化dp[0][0] = 1, dp[0][1~arrLen-1] = 0
----
ac了27/31 , 超出空间限制了,优化:
如果只能走5步,那么就不可能走到五步以后的位置!
*/
arrLen = Math.min(arrLen,steps); // 优化1 走不到的位置就别开辟空间了
arrLen = Math.min(arrLen,steps/2+1); // 优化2 想要走回去,说明不能走太远,最远走一半
long dp[][] = new long[steps+1][arrLen];
dp[0][0] = 1;
for(int i = 1 ; i < steps+1 ; i++){
for(int j = 0 ; j < arrLen ; j++){
long x=0,y=0,z=0;
if(j-1>=0)x=dp[i-1][j-1];
if(j+1<arrLen)y=dp[i-1][j+1];
z=dp[i-1][j];
dp[i][j]=x+y+z;
dp[i][j]%=1_000_000_007;
}
}
return (int)dp[steps][0];
}