Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

解法1:DFS,超时。

思路:其实类似对二叉树的DFS,只是终止条件不同,递归的终止条件就是到达最后一列,或者到达最后一行,因为最后一列的数字只有一个选择就是往下走,最后一行类似只有往右走。

当走到grid[rowMax-1][colMax-1],也就是一次路径完成,并和minSum做较,取较小的。

超时输入:

int my_grid[rowMax][colMax]={

{7,1,3,5,8,9,9,2,1,9,0,8,3,1,6,6,9,5},
{9,5,9,4,0,4,8,8,9,5,7,3,6,6,6,9,1,6},
{8,2,9,1,3,1,9,7,2,5,3,1,2,4,8,2,8,8},
{6,7,9,8,4,8,3,0,4,0,9,6,6,0,0,5,1,4},
{7,1,3,1,8,8,3,1,2,1,5,0,2,1,9,1,1,4},
{9,5,4,3,5,6,1,3,6,4,9,7,0,8,0,3,9,9},
{1,4,2,5,8,7,7,0,0,7,1,2,1,2,7,7,7,4},
{3,9,7,9,5,8,9,5,6,9,8,8,0,1,4,2,8,2},
{1,5,2,2,2,5,6,3,9,3,1,7,9,6,8,6,8,3},
{5,7,8,3,8,8,3,9,9,8,1,9,2,5,4,7,7,7},
{2,3,2,4,8,5,1,7,2,9,5,2,4,2,9,2,8,7},
{0,1,6,1,1,0,0,6,5,4,3,4,3,7,9,6,1,9}};

代码:

class Solution {
private:
int minSum;
vector<vector<int>> my_grid;
int rowMax;
int colMax;
public:
void tra(int i,int j,int sum){
sum+=my_grid[i][j];
if(j==colMax-&&i<rowMax)
{
++i;
for (i;i<rowMax;++i)
{
sum+=my_grid[i][j];
}
if(i==rowMax&&sum<minSum){
minSum=sum;
}
return;
}
if(i==rowMax-&&j<colMax)
{
++j;
for (j;j<colMax;++j)
{
sum+=my_grid[i][j];
}
if(j==colMax&&sum<minSum){
minSum=sum;
}
return;
}
tra(i,j+,sum);
tra(i+,j,sum);
}
int minPathSum(vector<vector<int>>& grid) {
minSum=(~(unsigned int))>>;
my_grid=grid;
rowMax=grid.size();
colMax=grid[].size();
tra(,,);
return minSum;
} };

解法2:DP(还是不熟练,不太熟练递推dp和递归dp的区别,参考文章

dp[100][100];该dp数组记录的是每个位置上的最优解,即到达这一点的路径最小值。假设我们要求以grid[i][j]为末尾的最小路径值,我们只需要求出它头上一个格子,和左边格子为末尾的最小路径值之中的最小值,也即min{dp[i-1][j],dp[i][j-1]}.

所以综合下,动态转移方程就是dp[i][j]=min{dp[i-1][j],dp[i][j-1]}+grid[i][j];

代码:

class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
if(grid.size()==)
return ;
vector<vector<int>> res(grid);
int i, j;
for(int j=; j<res[].size(); ++j){
res[][j] += res[][j-];
}
for(int j=; j<res.size(); ++j){
res[j][] += res[j-][];
}
for(i=; i<res.size(); ++i){
for(int j=; j<res[i].size(); ++j){
res[i][j] = min(res[i-][j], res[i][j-])+grid[i][j];
}
}
return res[grid.size()-][grid[].size()-]; //注意行列的size不一定一样
}
};

Minimum Path Sum(DFS,DP)的更多相关文章

  1. 64. Minimum Path Sum (Graph; DP)

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  2. [LeetCode] Unique Paths && Unique Paths II && Minimum Path Sum (动态规划之 Matrix DP )

    Unique Paths https://oj.leetcode.com/problems/unique-paths/ A robot is located at the top-left corne ...

  3. Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)

    Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...

  4. LeetCode: Minimum Path Sum 解题报告

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

  5. 【leetcode】Minimum Path Sum

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

  6. 【LeetCode练习题】Minimum Path Sum

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

  7. LeetCode之“动态规划”:Minimum Path Sum && Unique Paths && Unique Paths II

    之所以将这三道题放在一起,是因为这三道题非常类似. 1. Minimum Path Sum 题目链接 题目要求: Given a m x n grid filled with non-negative ...

  8. 刷题64. Minimum Path Sum

    一.题目说明 题目64. Minimum Path Sum,给一个m*n矩阵,每个元素的值非负,计算从左上角到右下角的最小路径和.难度是Medium! 二.我的解答 乍一看,这个是计算最短路径的,迪杰 ...

  9. leecode 每日解题思路 64 Minimum Path Sum

    题目描述: 题目链接:64 Minimum Path Sum 问题是要求在一个全为正整数的 m X n 的矩阵中, 取一条从左上为起点, 走到右下为重点的路径, (前进方向只能向左或者向右),求一条所 ...

随机推荐

  1. 用css制作圆环图表 (vue,sass)

    效果图: 思路 :在一个容器里再放两个矩形,每个矩形都占一半,给这两个矩形都设置溢出隐藏,当去旋转矩形里面的圆形的时候,溢出部分就被隐藏掉了,这样就可以达到想要的效果. 代码-html: <di ...

  2. 在SQLServer 2005附加SQLServer 2008数据库异常处理

    远程服务器软件系统不算新,数据库是SQL Server 2005.本地开发基本是用新的软件系统.数据库采用SQL Server 2008. 这样在用远程服务器SQL 2005选择附加SQL 2008的 ...

  3. js中cookie的操作

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  4. vue2.0 vue.set()

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. OpenFlow_tutorial_2_Install_Required_Software

    一.Required Software 我操作系统用的 ubuntu 18.04.vm image的OS是ubuntu14.04,这两个系统的GUI应该已经不兼容了,如果使用ubuntu18.04的主 ...

  6. emil 的使用

    摘抄自别人 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段  --用于指明发 ...

  7. Python2和Python3除法

    Python2和Python3除法   Python2除法:/,//,% "/":整数相除,向下取整:浮点数相除,结果包含小数(类似1/2,想保留小数应该写成1.0/2或者1*1. ...

  8. 解决android的键盘弹出时,html页面的高度被压缩

    如果元素的高度是用100%表示,那么,安卓的键盘弹出时,高度会发生变化,导致布局混乱,所以最好给高度设置像素高度 $("html,body").height(window.inne ...

  9. C#解析单层html的中的文本,然后拼接起来

    匹配单层html的小demo,应该能匹配大多数html字符串.多层(嵌套)html标签解析不出来.可能有小bug,我抛砖引玉下,哈哈. using System; using System.Colle ...

  10. 二维码之zxing仿新浪微博二维码

    在前言中最后部分,提到了二维码开发工具资源ZXing.网上有它最新1.7版的源码,感兴趣的可以下载下来看看,要打包生成core比较麻烦,网上有相关教程.嫌麻烦的朋友,可以去我的资源里下载Java版的c ...