其实主要还是这个初始化 也就是二维数组是如何初始化的 这点要清楚 首先假设m行n列
那么就是vector<vector<int>> dp (m,vector<int>(n,0) ) 这样子 主要就是括号里的不用加名称也不能加名称 因为这属于是初始化,创建的临时对象 因此不能加名称。比如vector<vector<int>> dp (m,vector<int> a(n,0) )这样 就错了
还有这个第一题临时路径 其实就是你要懂不是四个维度 而是两个维度推出来的 就是[i-1][j]和[i][j-1] 然后还有一个初始化的问题 动态规划就是 1 确定dp数组和下标含义 2确定递推公式 3dp初始化
4 遍历顺序 (5举例推导) 然后两层for循环遍历就可以了(行和列)
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp (m,vector<int>(n,0));
for(int i=0;i<n;i++){
dp[0][i]=1;
}
for(int i=0;i<m;i++){
dp[i][0]=1;
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};
第二题 你还是要考虑 初始障碍物为1 和最终障碍物为1 这两种情况 都要去考虑
注意啊注意 还有一个就是你在初始化的时候一但遇到了障碍物的话 后面就都应该是0 !!! 而不是1
还有一个就是在读行和列的时候 你可以用xxx.size()先读出来行 然后用xxx[0].size()读出来列 就可以了!!!
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
vector<vector<int>> dp (m,vector<int>(n,0));
if(obstacleGrid[m-1][n-1]==1||obstacleGrid[0][0]==1)
return 0;
for(int i=0;i<m;i++){
if(obstacleGrid[i][0]==1){
dp[i][0]=0;
break;
}
else dp[i][0]=1;
}
for(int j=0;j<n;j++){
if(obstacleGrid[0][j]==1){
dp[0][j]=0;
break;
}
else dp[0][j]=1;
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]==1){
dp[i][j]=0;
}
else dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};