本题源自LeetCode
--------------------------------------------------------------------
思路 动态规划
1 如果 i=0并且 j!=0 则下一步只能向右走。
2 否则j=0且i!=0 则只能下走。
3 如果 i 和 j 都不等于0 则 选择向下 和向右 最小的那个。
int minPathSum(vector<vector<int> > &grid) {
int rows=grid.size();
int cols=0;
if(rows!=0){
cols=grid[0].size();
}
if(rows==0||cols==0)
return 0;
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(i==0&&j!=0){
grid[i][j] += grid[i][j-1];
}
if(i!=0&&j==0){
grid[i][j] += grid[i-1][j];
}
if(i*j!=0){
grid[i][j]=min(grid[i-1][j],grid[i][j-1]);
}
}
}
return grid[rows-1][cols-1];
}
2 延伸 路径跟踪问题。矩阵中只有 0 和 1 则如果为1 ,就不能通过。只能向下和向右移动
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int rows=obstacleGrid.size();
int cols=0;
if(rows!=0){
cols=obstacleGrid[0].size();
}
if(rows==0||cols==0)
return 0;
vector<vector<int>> dp(rows,vector<int>(cols,0));
dp[0][0]=1-obstacleGrid[0][0]; ///初始化为 障碍书相反的值
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(obstacleGrid[i][j]==0){
if(i==0&&j!=0){
dp[i][j]+=dp[i][j-1];
}
if(i!=0&&j==0){
dp[i][j]+=dp[i-1][j];
}
if(i!=0&&j!=0){
dp[i][j]+=dp[i][j-1]+dp[i-1][j];
}
}
}
}
return dp[rows-1][cols-1];
}