带权值的最小路径和

带权值的最小路径和

http://www.nowcoder.com/questionTerminal/23462ed010024fcabb7dbd3df57c715e

设dp[i][j]表示行数为i,列数为j的矩阵中,从左上角到右下角的最小路径和。状态公式:

  1. i>=2 && j>=2时,dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1]
  2. 基准1: dp[1][k] = dp[1][k-1] + grid[0][k-1]
  3. 基准2: dp[k][1] = dp[k-1][1] + grid[k-1][1]

状态公式的解释如下:

  1. 如果行数和列数都大于2,那么当前点的最小路径和为正上方节点最小路径和正左方节点最小路径和中的较小者,加上当前节点的值
  2. 只有一行时,累加即可
  3. 只有一列时,同样累加即可

代码如下:

//
// Created by jt on 2020/8/30.
//
#include <vector>
using namespace std;

class Solution {
public:
    /**
     *
     * @param grid int整型vector<vector<>>
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& grid) {
        // write code here
        if (grid.size() < 1) return 0;
        vector<vector<int> > dp(grid.size()+1, vector<int>(grid[0].size()+1, 0));
        for (int i = 1; i <= grid.size(); ++i) { dp[i][1] = dp[i-1][1] + grid[i-1][0]; }
        for (int i = 1; i <= grid[0].size(); ++i) { dp[1][i] = dp[1][i-1] + grid[0][i-1]; }
        for (int i = 2; i <= grid.size(); ++i) {
            for (int j = 2; j <= grid[0].size(); ++j) {
                dp[i][j] = min(dp[i-1][j], dp[i][j-1])
                           + grid[i-1][j-1]; // 别忘了加上当前值
            }
        }
        return dp[grid.size()][grid[0].size()];
    }
};
刷遍天下无敌手 文章被收录于专栏

秋招刷题历程

全部评论

相关推荐

03-25 16:22
南华大学 Java
不敢追175女神:你是打了上千个招呼吧?😂
点赞 评论 收藏
分享
05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务