https://leetcode-cn.com/problems/out-of-boundary-paths/
思路:非常简单的
d
p
dp
dp,考虑用
d
p
i
,
j
,
k
dp_{i,j,k}
dpi,j,k表示经过
i
i
i次移动后到达坐标
(
j
,
k
)
(j,k)
(j,k)的方案数,那么对于任意一个坐标
(
j
,
k
)
(j,k)
(j,k),与其相邻的四个网格坐标即为一次移动后可能到达的点。转移方程比较简单,直接看代码吧。
注意到
d
p
i
dp_i
dpi只利用到了
d
p
i
−
1
dp_{i-1}
dpi−1的信息,因此可以用滚动数组优化空间复杂度,不过我懒得写了orz。
class Solution {
public:
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
const int mod=1e9+7;
vector<vector<vector<int>>> dp(maxMove+1,vector<vector<int>>(m,vector<int>(n)));
int ans=0;
dp[0][startRow][startColumn]=1;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
for(int i=1;i<=maxMove;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<n;k++)
{
for(int d=0;d<4;d++)
{
int nj=j+dir[d][0];
int nk=k+dir[d][1];
if(nj<0||nj>=m||nk<0||nk>=n)
ans=(ans+dp[i-1][j][k])%mod;
else
dp[i][nj][nk]=(dp[i][nj][nk]+dp[i-1][j][k])%mod;
}
}
}
}
return ans;
}
};