不同路径 II - 力扣(LeetCode)
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
int dp[100][100]={0};
for (int i = 0; i < m && obstacleGrid[i][0]==0; i++)
dp[i][0] = 1;
for (int j = 0; j < n && obstacleGrid[0][j]==0; j++)
dp[0][j] = 1;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j]) dp[i][j]=0;
else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};
把int dp[100][100]={0};
放到class外面之后结果就会不同
int dp[100][100]={0};
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
for (int i = 0; i < m && obstacleGrid[i][0]==0; i++)
dp[i][0] = 1;
for (int j = 0; j < n && obstacleGrid[0][j]==0; j++)
dp[0][j] = 1;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j]) dp[i][j]=0;
else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};
这是为什么?现在还没找到答案。
还有我最初的想法
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int dp[101][101]={0};
int m=obstacleGrid.size(),n=obstacleGrid[0].size();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0&&j==0) dp[i+1][j+1]=1;
else dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j];
if(obstacleGrid[i][j]) dp[i+1][j+1]=0;
}
}
return dp[m][n];
}
};
双重循环中的语句顺序调换一下结果就会不同
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int dp[101][101]={0};
int m=obstacleGrid.size(),n=obstacleGrid[0].size();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0&&j==0) dp[i+1][j+1]=1;
if(obstacleGrid[i][j]) dp[i+1][j+1]=0;
else dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j];
}
}
return dp[m][n];
}
};
这又是为什么啊?
第一个是因为放到外面是全局数组,力扣对于全局数组只会初始化一次,会导致有前面的测试用例残留的结果留着这里了导致答案错误。
第二个是你第一个代码中的else跟着的是第一个if,第二个代码跟着的是第二个if肯定会不同呀
大佬我第一个懂了,
第二个第一段代码的逻辑首先会计算未遇到障碍物的路径数量,然后在遇到障碍物时将路径数量置为零。第二段代码是当遇到障碍物时会立即将路径数量置为零,不再计算那个位置路径数量。这个逻辑前后顺序不同会影响这么大吗?
第二个代码,你会把f[1][1]更新成0,首先是i==0 && j==0时f[1][1]=1,然后下面发现g[0][0]==0,然后会进入后面那个else那里又把f[1][1]更新成0导致答案错误
奥奥,懂了懂了,才开始学动态规划有点不太懂😭,感谢大佬!麻烦了!真🐂