
很经典的题型,但由于有方向限制,在更新 dp 时需要多考虑方向。
定义:dp[i][j][0]dp[i][j][0]dp[i][j][0] 表示从上方到达 (i,j)(i, j)(i,j)的路径数,dp[i][j][1]dp[i][j][1]dp[i][j][1] 表示从左方到达 (i,j)(i, j)(i,j)的路径数。
则到达某个格子的总路径数就是 dp[i][j][0]+dp[i][j][1]dp[i][j][0] + dp[i][j][1]dp[i][j][0]+dp[i][j][1]。
更新时,分方向讨论。
若上方为空格,则:dp[i][j][0]=dp[i−1][j][0]+dp[i−1][j][1]dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]dp[i][j][0]=dp[i−1][j][0]+dp[i−1][j][1] ;
若左方为空格,则:dp[i][j][1]=dp[i][j−1][0]+dp[i][j−1][1]dp[i][j][1]=dp[i][j-1][0]+dp[i][j-1][1]dp[i][j][1]=dp[i][j−1][0]+dp[i][j−1][1]
若上方为镜子,则:dp[i][j][0]=dp[i−1][j][1]dp[i][j][0]=dp[i-1][j][1]dp[i][j][0]=dp[i−1][j][1] ;
若左方为镜子,则:dp[i][j][1]=dp[i][j−1][0]dp[i][j][1]=dp[i][j-1][0]dp[i][j][1]=dp[i][j−1][0]
代码如下:
cpp
#define MOD 1000000007
class Solution {
public:
int uniquePaths(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
int ans = 0;
vector dp(m, vector<vector<long long int> >(n, vector<long long int>(2, 0)));
dp[0][0][0] = 1;
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
if(i==0 && j==0) continue;
if(i > 0){
if(grid[i-1][j]==0){
dp[i][j][0] = (dp[i-1][j][0] + dp[i-1][j][1])%MOD;
} else{
dp[i][j][0] = dp[i-1][j][1]%MOD;
}
}
if(j>0){
if(grid[i][j-1]==0){
dp[i][j][1] = (dp[i][j-1][1] + dp[i][j-1][0])%MOD;
} else{
dp[i][j][1] = dp[i][j-1][0]%MOD;
}
}
}
}
if(grid[m-1][n-1] == 1){
return 0;
} else{
return (dp[m-1][n-1][0] + dp[m-1][n-1][1]) %MOD;
}
}
};