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

算法描述

在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小

右图为一个4行的点数值三角形

算法思路

  1. 接收用户输入行数n
  2. 使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成
  3. 定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右0代表左
  4. 定义一个二维数组b[n+1][n+1] 表示到底端的数值之和

    以上图4行的点数值三角形为例

    b[4][1]=47 b[4][2]=93

    b[3][1]=43

    这里b[3][1]是可以等于47,也可以等于93,但题目要求的是最小,所以这里取小的值

    b[3][1]其实是由逆推得到的,具体看下面

  5. b[n+1][n+1]的递推关系
    • 初始值

      从最后一行开始

      b[n][i]=a[n][i] i遍历完最后一行的所有元素

    • 递推关系

      b[n][i]=Math.min(b[n+1][i],b[n+1][i+1]) 取最小值

算法实现

    System.out.println("输入数字三角形的行数n:");
    Scanner scanner = new  Scanner(System.in);
    int n = scanner.nextInt();
    scanner.close();
    int[][] a= new int[n+1][n+1];

    //随机赋值数字三角形
    for(int i=1;i<n+1;i++){
        for(int j =1;j<=i;j++){
            a[i][j] = (int) (Math.random()*100);
        }

    }
    //输出数字三角形
    for(int i=1;i<n+1;i++){
        for(int j =1;j<=i;j++){
            System.out.print(a[i][j]+"    ");
        }
        System.out.println("");

    }

    int[][] b = new int[n+1][n+1];
    int[][] direction = new int[n+1][n+1];//0是左,1是右

    //最后一行的长度为其本身
    for(int i=1;i<n+1;i++){
        b[n][i] = a[n][i];
    }

    //关键逆推代码
    for(int i=n-1;i>=1;i--){
        for(int j=1;j<=i;j++){
            if(b[i+1][j+1]<b[i+1][j]){
                b[i][j]=a[i][j] + b[i+1][j+1];
                direction[i][j]=1;//右边的数值较大,则记录方向为右

            }else{
                b[i][j]=a[i][j] + b[i+1][j];
                direction[i][j]=0;//左边的数值较大,则记录方向为左
            }
        }
    }
    System.out.println("最小路径和为"+b[1][1]);
    int flag = 1;
    int j=1;
    //循坏结束
    while(flag!=n){
        System.out.print(a[flag][j]);
        if(direction[flag][j]==1){
            System.out.print("->向右");
            flag++;
            j++;

        }else{
            System.out.print("->向左");
            flag++;
        }

    }
    System.out.print("->"+a[flag][j]);

}
    

结果

原文地址:https://www.cnblogs.com/kexing/p/9954821.html

时间: 2024-10-12 20:08:57

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

Leetcode:Triangle 三角形塔最小路径和

Triangle: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to botto

算法学习——动态规划1

众所周知,在面试中最难,也是大公司最容易考的就是动态规划,所以今天打算开撕动态规划,之前只是对于单个的题目知道解法,不过时间一久就忘记了,今天开始要彻底的理解方法论再到实践,希望老天保佑能够一周搞定! 一.通过一个小例子了解方法论: 一个例子,如上图: 求从起点到终点的最短路径: 这是一道最基本的动态规划问题,如果不使用动态规划可以使用穷举进行求解,路径大概存在2的k次方.利用动态规划求解主要步骤: 1. 找出规划的初始状态:对此,找出第一个子问题的解从而可以在后面的内容中利用该解来作为后面状态

算法学习 - 动态规划(DP问题)(C++)

这几天一直再看,觉得看懂了一些,先记下来. 动态规划 动态规划是运筹学的一个方向,就是把多级最优化问题分解成一系列的单阶问题.在不断增加的过程中,不断的计算当前问题的最优解. 一般分为如下四个部分: 线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等: 区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等: 树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等: 背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等: 汽车

算法学习——动态规划2

投资问题: 问题描述:有m元钱,投资给n的项目,f(x): 将x元投入到第i个项目中的效益.求使得总效益最大的投资方案.(这道题太不容易了,这是我第一次没有看答案做出了动态规划的问题,应该是花了三个小时). 建模:问题的解是向量<x1,x2,xn> 目标函数:max{f1(x1)+f2(x2)+fn(xn)} 对于子问题的划分和计算顺序: k:考虑对于项目1,2,,,k的投资 x:总钱数不能超过x 原始输入,k=n ,x=m k=1到n x=1到m 假设有一个五万元的可以投资在四个项目上面,投

算法学习——动态规划3

背包问题: 又是经历了一个非常痛苦的阶段,终于解决了一个非常简单而经典的动态规划问题. 问题描述: 一个旅行者随身带一个背包.可以放背包的物品有n种,每种物品的重量和价值分别为w和v.背包的最大重量限制是b,每种物品可以放多个,怎么放可以使背包价值最大? 思路: 1. 这一道问题属于线性规划问题:由线性约束的线性函数取最大或者最小问题. 2. 划分子问题: 有参数k和y界定: k:考虑物品1,2,3.......k的选择 y:背包的总重量不能超过y 原始输入, k = n, y = b 子问题计

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划 我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++) 这里说一下,遇到动态规划应该如何去想,才能找到解决办法. 最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系. minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[

由LCS到编辑距离—动态规划入门—算法学习笔记

一切计算机问题,解决方法可以归结为两类:分治和封装.分治是减层,封装是加层. 动态规划问题同样可以用这种思路,分治. 它可以划分为多个子问题解决,那这样是不是用简单的递归就完成了?也许是的,但是这样会涉及太多的不便的操作.因为子问题有重叠! 针对这种子问题有重叠的情况的解决,就是提高效率的关键. 所以动态规划问题可以总结为:最优子结构和重叠子问题. 解决这个子问题的方式的关键就是:memoization,备忘录. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方

数据结构与算法学习之路:背包问题的贪心算法和动态规划算法

一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算法:贪心算法基于的思想是每一次选择都作当前最好的选择,这样最后的结果虽然不一定是最优解,但是也不会比最优解差很多. 举个例子说明可能好懂一些:一帮基友去聚餐,菜是一份一份上的,我每一次夹菜都只夹牛肉/海鲜吃,可能到最后我吃的牛肉/海鲜很多,但不一定代表我吃掉的东西的总价值最高,但是相对来说价值也很高

关于贪心算法和动态规划的学习 - 背包问题为例

说到背包问题,我看到了很多分类,不同的类似问题,有不一样的解法,看到的最多的两种方式是贪心算法和动态规划,于我来说,更迫切的应该是要认识一下,这些算法的区别和相同的地方,所以这节就来找资料学习一下贪心算法和动态规划的区别. 这是找到的一个对我帮助最大的,源地址:https://www.cnblogs.com/Renyi-Fan/p/7741089.html 看之前先摘一下这几个解决方案的区别:摘自网上 "所以一个问题,该用递推.贪心.搜索还是动态规划,完全是由这个问题本身阶段间状态的转移方式决定