576. 出界的路径数
var dp1 = new Array(m).fill(0).map(() => new Array(n).fill(0));建立模型,dp1[i][j]代表i,j这个位置走过的次数,默认情况下都为0,起始位置设置为1,所以有dp1[startRow][startColumn] = 1;
for (var k = 1; k <= maxMove; k++) { 走动的步数是固定的,我们需要从第一步开始走,然后走第二步,直到走到第maxMove步
var dp2 = new Array(m).fill(0).map(() => new Array(n).fill(0));每一个k值情况,都会重置dp2,然后基于dp1生成新的dp2,操作结束后,dp1 = dp2,把新的dp2赋值给dp1,为了下一个循环做准备
dp2[i1][j1] = (dp2[i1][j1] + dp1[i][j]) % MOD; 四个方向其中一个,从位置i,j到i1,j1没有超出边界,于是要累加一下,因为有可能其他位置到i1,j1,也会生成dp2[i1][j1]
count = (count + dp1[i][j]) % MOD; 超出边界了,就累加count
var findPaths = function (m, n, maxMove, startRow, startColumn) {
var MOD = 1000000007;
var directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
var count = 0;
var dp1 = new Array(m).fill(0).map(() => new Array(n).fill(0));
dp1[startRow][startColumn] = 1;
for (var k = 1; k <= maxMove; k++) {
var dp2 = new Array(m).fill(0).map(() => new Array(n).fill(0));
for (var i = 0; i < m; i++) {
for (var j = 0; j < n; j++) {
if (dp1[i][j] > 0) {
for (var direction of directions) {
var i1 = i + direction[0], j1 = j + direction[1];
if (i1 >= 0 && i1 < m && j1 >= 0 && j1 < n) {
dp2[i1][j1] = (dp2[i1][j1] + dp1[i][j]) % MOD;
} else {
count = (count + dp1[i][j]) % MOD;
}
}
}
}
}
dp1 = dp2;
}
return count;
};