最上层加一层0,最左层加一层1,可以省略很多特判~
用于二维DP的一个简化思路,好耶
C++
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
// 思路:同样是从上面来和左边来
/**
但是要加判断,如果ij 是障碍物,那就加上非障碍物的那边
*/
const int N = 105;
int f[N][N];
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
cout << "m = " << m << ",n = " << n << endl;
// 偏移一位置比较好做,也就是说:位置0,0,在f中的实际坐标是1,1,也就是i 和 j各加1,也就是左上角直接加上一整层,上方一层0,方一层0,很方便!不用考虑边界条件
// 默认初始化的值是0,不用计算
for (int i = 1; i <= m; i ++ ) {
for (int j = 1; j <= n; j ++ ) {
if (obstacleGrid[i - 1][j - 1] == 1) f[i][j] = 0; // 如果是障碍物位置,直接到达不了
else if (i == 1 && j == 1) f[i][j] = 1;
else f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
for (int i = 0; i < 5; i ++ ) {
for (int j = 0; j < 5; j ++ ) {
cout << f[i][j] << " ";
}
cout << endl;
}
return f[m][n];
}
};