LeetCode64. 最小路径和

这题和62题以及63题类似,只不过dp数组的状态表示变了,这里dp数组不再表示方案数,而是到当前格子的最小路径和。可以发现:要到达第i行第j列的格子,只有从第i - 1行第j列的格子或第i行第j - 1列的格子加上到第i行第j列的格子需要的代价(grid[i][j])得到,所以如果要得到到第i行第j列格子的最小路径和,我们只需要获取第i - 1行第j列的格子或第i行第j - 1列的格子二者中路径和较小的那个,再加上grid[i][j]即可。
由此我们得到状态转移方程:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
获得状态转移方程后,还需要对dp数组做初始化,显然第0列某个格子的最小路径和等于从起点开始到当前格子的所有代价(grid)相加得到,因为要到第0列的格子只有从起点一直向下走这一种走法。同理,到第0行的格子也等于从起点开始到当前格子的所有代价总和。
有了递推边界和状态转移方程之后,我们就可以从边界递推到整个数组,最终返回右下角的格子的最小路径和。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int rows = grid.size(), cols = grid[0].size(); //获取总行数和总列数
if(rows == 0 || cols == 0) { //需要特判行数或列数为0的情况,LeetCode特色
return 0;
}
vector<vector<int>> dp(rows, vector<int>(cols)); //dp[i][j]表示到第i行第j列的格子的最小路径和
dp[0][0] = grid[0][0];
for(int i = 1; i < rows; ++i) { //初始化边界:第0列的所有格子的最小路径和都是从起点开始到当前格子的代价总和
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for(int i = 1; i < cols; ++i) { //初始化边界:第0行的所有格子的最小路径和都是从起点开始到当前格子的代价综合
dp[0][i] = dp[0][i - 1] + grid[0][i];
}
for(int i = 1; i < rows; ++i) {
for(int j = 1; j < cols; ++j) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[rows - 1][cols - 1];
}
};
LeetCode64. 最小路径和的更多相关文章
- leetcode-64. 最小路径和 · vector + DP
题面 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right wh ...
- [Swift]LeetCode64. 最小路径和 | Minimum Path Sum
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)
1. 数组去重 题目描述 /** * 有序数组去重 * 输出最终的数字个数 * 输入:1,2,2 * 输出:2 * @author Turing * */ 代码 import java.util.*; ...
- [LeetCode] Minimum Path Sum 最小路径和
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- 【HDU1960】Taxi Cab Scheme(最小路径覆盖)
Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 最小路径(prim)算法
#include <stdio.h>#include <stdlib.h>/* 最小路径算法 -->prim算法 */#define VNUM 9#define MV 6 ...
- loj 1429(可相交的最小路径覆盖)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...
- 【HDU3861 强连通分量缩点+二分图最小路径覆盖】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...
- POJ 3216 最小路径覆盖+floyd
Repairing Company Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 6646 Accepted: 178 ...
随机推荐
- MyBatis(三)动态SQL与缓存
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.动态SQL语句 准备工作: public class User { private int id; ...
- QTI EAS学习之find_energy_efficient_cpu
Energy Awareness Scheduler是由ARM和Linaro开发的新的linux kernel调度器. 原先CFS调度器是基于policy进行调度,并有不同的吞吐量.例如,有一个新的t ...
- Java实现蓝桥杯历届试题回文数字
历届试题 回文数字 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做: ...
- Java实现 LeetCode 77 组合
77. 组合 给定两个整数 n 和 k,返回 1 - n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], ...
- Java实现LeetCode_0007_ReverseInteger
package javaLeetCode_primary; import java.util.Scanner; /** * Given a 32-bit signed integer, reverse ...
- java实现最近距离
已知平面上的若干点的位置,存入一个List中.现在需要计算所有这些点中, 距离最近的两个点间的最小距离.请补全缺失的代码. 把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的&quo ...
- java实现第二届蓝桥杯最小公倍数(c++)
最小公倍数. 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4,5,6 ...
- 去摆摊吧,落魄的Java程序员
真的,我也打算去摆摊,宣传语我都想好了.沉默王二,一枚有颜值却靠才华苟且的程序员,<Web 全栈开发进阶之路>作者,CSDN 明星博主,周排名第 4,总排名 40,这数据在众多互联网大咖面 ...
- mysql基础-新版5.7.10源码安装-记录(一)
0x01 MySQL 从 5.5 版本开始,通过 ./configure 进行编译配置方式已经被取消,取而代之的是 cmake 工具 引用一句话 cmake的重要特性之一是其独立于源码(out-of- ...
- 4.vue class 绑定- model基础应用
//代码可以复制自行体验 <template> <div id="app" @click.stop="test('你点击了我big- ...