文章目录
- 系列文章目录
- 一、一般性矩阵寻多种最短路径问题
- 传送门:各种迷宫寻路径问题(一)_躺平的小智的博客-CSDN博客
- 二、一般性迷宫问题 加强版
- 传送门:各种迷宫寻路径问题(二)_躺平的小智的博客-CSDN博客
- 三、一般性迷宫问题 加强版(二)
- 传送门:各种迷宫寻路径问题(三)_躺平的小智的博客-CSDN博客
- 四、有障碍,任意走的基础迷宫最短路径问题
- 传送门:各种迷宫问题(四)_躺平的小智的博客-CSDN博客
- 五、矩阵中寻找特殊元素路径
- 传送门:各种迷宫问题(五)_躺平的小智的博客-CSDN博客
- 六、矩阵中寻找特殊元素路径(二)
- 传送门:各种迷宫问题(六)_躺平的小智的博客-CSDN博客
- 七、美团力扣周赛
- 传送门:美团迷宫问题_躺平的小智的博客-CSDN博客
- 八、滴滴秋招笔试题
- 传送门:滴滴迷宫笔试题_躺平的小智的博客-CSDN博客
三、一般性矩阵寻多种最短路径问题 升级版(无障碍,无钥匙,右下走,损耗不同)
这种问题在(一)的基础上加了损耗不同这个条件
解法一:
我们还是考虑动态规划,之前我们是损耗相同,所以我们赋予dp数组的是可通行条数,而不是消耗的体力,此题中我们只需要更改一下dp数组的状态方程即可,把状态方程更改为这条路径消耗体力的值。
状态方程:dp[i][j] = min(dp[i][j-1] + dp[i-1][j]) + a[i][j];
此时边界条件我们同样需要改变,及dp[0][0]=grid[0][0],dp[0][j]与dp[i][0]变成了grid的和的叠加。
代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n =grid[0].size();
vector<vector<int>> dp(m,vector<int>(n,0));
dp[0][0]=grid[0][0];
for(int i =1;i<m;i++){
dp[i][0]=dp[i-1][0]+grid[i][0];
}
for(int j = 1;j<n;j++){
dp[0][j] = dp[0][j-1]+grid[0][j];
}
for(int i = 1;i<m;i++){
for(int j = 1;j<n;j++){
dp[i][j] = min(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[m-1][n-1];
}
};
注意:无障碍的时候我们可以不用去判断m、n为一行一列的情况,因为总能通行。
解法二:
回溯递归,在本题中会超时。