看大神分析:
使用一个三维的DP数组,其中dp[k][i][j]表示总共走k步,从(i,j)位置走出边界的总路径数。那么我们来找递推式,对于dp[k][i][j],走k步出边界的总路径数等于其周围四个位置的走k-1步出边界的总路径数之和,如果周围某个位置已经出边界了,那么就直接加上1,否则就在dp数组中找出该值,这样整个更新下来,我们就能得出每一个位置走任意步数的出界路径数了,最后只要返回dp[N][i][j]就是所求结果了。
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)));
for(int k = 1; k <= N; ++k)
{
for(int x = 0; x < m; ++x)
{
for(int y = 0; y < n; ++y)
{
long long up = (x == 0) ? 1 : dp[k - 1][x - 1][y];
long long bottom = (x == m - 1)? 1: dp[k - 1][x + 1][y];
long long left = (y == 0) ? 1 : dp[k - 1][x][y - 1];
long long right = (y == n - 1) ? 1 : dp[k - 1][x][y + 1];
dp[k][x][y] = (up + bottom + left + right) % 1000000007;
}
}
}
return dp[N][i][j];
}
};