576. Out of Boundary Paths

这道题目需要定义三维dp:
dp[i][j][k]:第i步走到[j,k]位置共有多少种方法。
class Solution {
public:
int findPaths(int m, int n, int N, int i, int j) {
vector<vector<vector<int>>> dp(N+1, vector<vector<int>>(m, vector<int>(n, 0)));
dp[0][i][j] = 1;
int mod = 1e9+7;
int retCnt = 0;
vector<vector<int>> dirs{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (int i = 0; i < N; ++i) {
for (int j = 0; j < m; ++j)
for (int k = 0; k < n; ++k) {
for (auto& dir : dirs) {
if (j+dir[0]<0 || j+dir[0]>=m || k+dir[1]<0 || k+dir[1]>=n) {
retCnt = (retCnt + dp[i][j][k]) % mod;
} else
dp[i+1][j+dir[0]][k+dir[1]] = (dp[i+1][j+dir[0]][k+dir[1]]+dp[i][j][k])%mod;
}
}
}
return retCnt;
}
};
因为每次只从上一层推导过来,所以可以优化到只需要两个二维数组就可以了。
浙公网安备 33010602011771号