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}};

代码:

  1. class Solution {
  2. private:
  3. int minSum;
  4. vector<vector<int>> my_grid;
  5. int rowMax;
  6. int colMax;
  7. public:
  8. void tra(int i,int j,int sum){
  9. sum+=my_grid[i][j];
  10. if(j==colMax-&&i<rowMax)
  11. {
  12. ++i;
  13. for (i;i<rowMax;++i)
  14. {
  15. sum+=my_grid[i][j];
  16. }
  17. if(i==rowMax&&sum<minSum){
  18. minSum=sum;
  19. }
  20. return;
  21. }
  22. if(i==rowMax-&&j<colMax)
  23. {
  24. ++j;
  25. for (j;j<colMax;++j)
  26. {
  27. sum+=my_grid[i][j];
  28. }
  29. if(j==colMax&&sum<minSum){
  30. minSum=sum;
  31. }
  32. return;
  33. }
  34. tra(i,j+,sum);
  35. tra(i+,j,sum);
  36. }
  37. int minPathSum(vector<vector<int>>& grid) {
  38. minSum=(~(unsigned int))>>;
  39. my_grid=grid;
  40. rowMax=grid.size();
  41. colMax=grid[].size();
  42. tra(,,);
  43. return minSum;
  44. }
  45.  
  46. };

解法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];

代码:

  1. class Solution {
  2. public:
  3. int minPathSum(vector<vector<int> > &grid) {
  4. if(grid.size()==)
  5. return ;
  6. vector<vector<int>> res(grid);
  7. int i, j;
  8. for(int j=; j<res[].size(); ++j){
  9. res[][j] += res[][j-];
  10. }
  11. for(int j=; j<res.size(); ++j){
  12. res[j][] += res[j-][];
  13. }
  14. for(i=; i<res.size(); ++i){
  15. for(int j=; j<res[i].size(); ++j){
  16. res[i][j] = min(res[i-][j], res[i][j-])+grid[i][j];
  17. }
  18. }
  19. return res[grid.size()-][grid[].size()-]; //注意行列的size不一定一样
  20. }
  21. };

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. AJPFX关于StringBuffer类的总结

    StringBuffer类一.字符串缓冲区,是一个容器.没有子类不能继承.特点:长度可变化:可操作多个数据类型:可通过toString()变成字符串.二.存储方法1.StringBuffer appe ...

  2. mvc的生命周期

    尽管每次都是从msdn里复制粘贴,但是还是有必要的,加深对mvc的理解和官方的表述. 了解 MVC 应用程序执行过程 发送给基于 ASP.NET MVC 的 Web 应用程序的请求首先通过 UrlRo ...

  3. 2017团体程序设计天梯赛大区赛 L3-3 球队“食物链”

    思路: 状压dp. 实现: #include <iostream> #include <cstdio> #include <cstring> using names ...

  4. iOS Programming View and View Hierarchy 视图和视图等级

    iOS Programming  View and View Hierarchy 视图和视图等级 1.1(1)File → New → Project.. From the iOS section, ...

  5. Windows bat 设置代理

    转自tt-0411 @echo off cls color 0A Echo The program is running... Echo Setting the ip and dns... netsh ...

  6. cookie存储位置

    平时各位在做项目时多半时候都会用到客户端的cookie,可大家知道cookie是存储在哪里吗? 首先cookie失效分为2种: 1:设置过期时间失效(只要设置了过期时间cookie就会存储在硬盘里面) ...

  7. 【JavaScript从入门到精通】第二课

    第二课 初探JavaScript魅力-02 变量 说起变量,我们不得不提起我们有一部比较古老的电视剧叫<包青天>.包青天有一把非常厉害的宝剑叫“尚方宝剑”,见到尚方宝剑有如见到皇帝.某种程 ...

  8. JAVA基础——设计模式之简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...

  9. iOS sandbox

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  10. 基于js插件的文件上传

    <?php /** * Created by PhpStorm. * User: GyCCo. * Date: 05/02/2018 * Time: 4:46 PM */ session_sta ...