实际上从示例已经可以看出思路来,
状态定义:
f
[
i
]
[
j
]
[
s
t
e
p
]
f[i][j][step]
f[i][j][step] 表示在位置
(
i
,
j
)
(i,j)
(i,j) 时必须走
s
t
e
p
step
step步的方案数。
如何转移,向四个方向转移即可。
(其实这道题目使用记忆化实现可能更简洁一点。。。)
const int N = 55;
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,0};
class Solution {
public:
int mod = (int)1e9+7;
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
if(maxMove == 0) return 0;
int f[N][N][N] = {0};
for(int step = 1; step <= maxMove; step++) {
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
for(int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if(x < 0 || x >= m || y < 0 || y >= n) {
if(step == 1) {
f[i][j][1]++;
}
continue;
}
f[i][j][step] = (long long)(f[i][j][step] + f[x][y][step - 1])%mod;
}
}
}
}
int ans = 0;
for(int i = 1; i <= maxMove; i++) {
ans = (long long)(ans + f[startRow][startColumn][i])%mod;
}
return ans;
}
};