【数据结构与算法】动态规划——最小路径和(普通矩阵、三角形两题)

最小路径和

LeetCode:最小路径和

题目描述:

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

思想:

动态规划,可以用原数组作为dp数组

代码:

class Solution {
    public int minPathSum(int[][] grid) {
        int i=0,j=0;
        for(i=0;i<grid.length;++i){
            for(j=0;j<grid[0].length;++j){
                if(i>0&&j>0){
                    grid[i][j]+= Math.min(grid[i-1][j],grid[i][j-1]);
                }else{
                    grid[i][j]+= (i==0?0:grid[i-1][j]) + (j==0?0:grid[i][j-1]);
                }
            }
        }
        return grid[i-1][j-1];
    }
}

三角形最小路径和

LeetCode:三角形最小路径和

题目描述:

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

示例:

例如给定三角形
[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

思想:

自底向上,修改dp数组

代码:

第一种方法:在原数组上修改。这样貌似效率不高。

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        for(int i=triangle.size()-2;i>=0;--i){
            for(int j=0;j<i+1;++j){
                triangle.get(i).set(j,triangle.get(i).get(j)+Math.min(triangle.get(i+1).get(j+1),triangle.get(i+1).get(j)));
            }
        }
        return triangle.get(0).get(0);
    }
}

第二种方法:设置dp数组,修改dp数组;注意这很巧妙,每一次修改都不会影响下次循环的判断;其次,每次循环,最后一个数都不会修改它,直到最后一轮,加上顶部的数,得到最终结果dp[0]。

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int len = triangle.size();
        int[] dp=new int[len];
        for(int i=0;i<len;++i){
            dp[i]=triangle.get(len-1).get(i);
        }
        for(int i=len-2;i>=0;--i){
            for(int j=0;j<i+1;++j){
                dp[j] = Math.min(dp[j],dp[j+1]) + triangle.get(i).get(j);
            }
        }
        return dp[0];
    }
}

原文地址:https://www.cnblogs.com/buptleida/p/12641541.html

时间: 2024-10-05 16:48:45

【数据结构与算法】动态规划——最小路径和(普通矩阵、三角形两题)的相关文章

cogs_396_魔术球问题_(最小路径覆盖+二分图匹配,网络流24题#4)

描述 http://cojs.tk/cogs/problem/problem.php?pid=396 连续从1开始编号的球,按照顺寻一个个放在n个柱子上,\(i\)放在\(j\)上面的必要条件是\(i+j\)是一个完全平方数.问做多能放到几号球. 分析 cogs是简化版,我在网上找了个完整版的测试数据,要求输出方案... 求最大放几号球不方便,我们考虑枚举最大的球号,计算最少需要多少柱子. 我们对于满足\(j<i\)且\(i+j\)是一个完全平方数的\(i,j\),从\(j\)向\(i\)连一条

数据结构与算法 -- 动态规划算法

1.0-1背包问题 //0-1背包问题--动态规划算法 public class DynamicPlan { public static void main(String[] args) { DynamicPlan dynamicplan = new DynamicPlan(); int[] weight = {1, 2, 3, 4, 5}; System.out.println("方法一 背包所装物品的重量为:" + dynamicplan.knapsack(weight, weig

&lt;数据结构与算法&gt;——动态规划(2)

NOTE 本博客后续均使用自顶向下的动态规划 一.Matrix DP 题目给一个矩阵(或被cut掉一部分的矩阵),具有坐标的概念,可以考虑为Matrix DP问题 state: f[x][y] :表示从起点走到坐标(x, y) ....... function: 研究走到(x, y) 这个点之前的点在哪?如何变化 initialize:起点 answer:终点 原文地址:https://www.cnblogs.com/isguoqiang/p/11483753.html

最小路径覆盖问题【网络流24题】

输入输出样例 输入 #1复制 11 12 1 2 1 3 1 4 2 5 3 6 4 7 5 8 6 9 7 10 8 11 9 11 10 11 输出 #1复制 1 4 7 10 11 2 5 8 3 6 9 3 说明/提示 1\leq n\leq 150,1\leq m\leq 60001≤n≤150,1≤m≤6000 由@FlierKing提供SPJ 思路 既然是网络流24中的题目,就从网络流的方法下手吧. 对于样例来说 其实不难看出这题是和流的路径有关的. 为了保证每个点只能用一次, 可

《数据结构与算法Python语言描述》习题第二章第二题(python版)

ADT Date: #定义日期对象的抽象数据类型 Date(self, int year, int month, int day) #构造表示year/month/day的对象 difference(self, Date d2) #求出self和d2的日期差 plus(self, int n) #计算出日期第self之后n天的日期 num_date(self, int year, int n) #计算year年第n天的日期 adjust(self, int n) #将日期d调整n天(n为带符号整

数据结构与算法推荐书单

对于入门的同学不建议过度追求看上去很经典的书籍,例如:<算法导论>/<算法>这些书.可以看一些相对容易看的书来入门,例如<大话数据结构>.<算法图解>. <大话数据结构>这本书最大的特点是它将理论讲的非常有趣,不枯燥.而且每个数据结构和算法作者都结合生活中的例子进行讲解,虽然这本书有400+页,但是花两天事件读完应该是没有问题的.如果之前完全不懂数据结构和算法,可以从这本书开始. <算法图解>和<大话数据结构>走得是同样的

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

程序员的进阶课-数据结构与算法

现在市面上的数据结构与算法的教程也都不少,但有两个问题,第一是泛泛而谈,第二是基本都是c语言实现,而java作为第一主流语言,理应有它自己的独到之处.这也是我写这些博客的初衷,我会讲解java实现的数据结构和算法. 至于说为什么要学习数据结构和算法,我相信大家都应该清楚.大家平时的工作,敲的业务代码,都属于外功,可以帮你轻松地完成老板交待的工作,每个月能挣到属于自己的那份钱.但我不知道小伙伴们有没有这样的困境,工作三到五年,项目做了很多,但自己的能力始终处于二流水平,写业务代码,没点问题:想跳槽

算法学习——动态规划之点数值三角形的最小路径

算法描述 在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小 右图为一个4行的点数值三角形 算法思路 接收用户输入行数n 使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成 定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右,0代表左 定义一个二维数组b[n+1][n+1] 表示到底端的数值之和 以上图4行的点数值三角形为例 b[4][1]=47 b[