动态规划入门_数塔问题
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input
1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output
30
(下面这段讲解从别人博客 复制的,地址:https://blog.csdn.net/hpu2022/article/details/81487979)
我们知道,从定点开始每次只有两个方向,左下和右下,要想知道如何走才能得到最大值,我们只需要知道它的两个子节点的如何走才能得到最大值,相同的情况我们又可以问它的子节点的子节点,这样重复下去一直都爱最后一行。
故最后的状态转移方程式 dp[i][j] = num[i][j] + max(dp[i+1][j], dp[i+1][j+1]); 注意这是倒推的,就好像我们只有知道了地 i+1个才能知道第i个。仔细想一想为什么递推完成后dp[1][1]就是最大值呢?(从循环条件中找答案)
Java实现代码:
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner cin = new Scanner(System.in);int n = cin.nextInt();for(int index= 0;index<n;index++){int [][] data = new int [110][110];int [][] dp = new int [110][110];int h = cin.nextInt();for(int i =1;i<=h;i++){for(int j = 1;j<=i;j++){data[i][j] = cin.nextInt();}}for(int i = 1;i<=h;i++){dp[h][i] = data[h][i];}for(int i = h-1;i>=1;i--){for(int j = 1;j<=i;j++){dp[i][j] = Math.max(dp[i+1][j],dp[i+1][j+1])+data[i][j];}}System.out.println(dp[1][1]);}} }
总结递归方程 dp [ i ][ j ] = max(dp [ i+1] [ j ], dp[ i+1 ] [ j +1 ] + data [ i ] [ j ];
转载于:https://www.cnblogs.com/kangxinxin/p/10755370.html
动态规划入门_数塔问题相关推荐
- 动态规划java实现数塔问题_动态规划入门_数塔问题
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...
- python 动态规划 数塔_数塔问题,简单的动态规划算法
/* 数塔问题: 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走, 一直走到底层,要求找出一条路径,使路径 ...
- 动态规划经典题目——数塔问题
一.题目 数塔问题 :要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 二.解题思路 动态规划解题思路可详见另一篇文章.数塔中元素用二维数组a[][]表示 ①定义状态 ...
- 动态规划算法之数塔问题
package cn.gldwolf.bigdata;/* 3 12 56 23 4 78 34 69 34 19 12 3 54 12 34 *//* 思路:从最底层往上走,判断下层两个节点中的最大 ...
- 算法.动态规划 导航/数塔取数字问题
目录 前言 从1+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...
- c++ 动态规划(数塔)
c++ 动态规划(dp) 题目描述 观察下面的数塔.写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大. 每一步可以从当前点走到左下角的点,也可以到达右下角的点. 输入 5 13 ...
- LQ训练营(C++)学习笔记_动态规划入门
动态规划入门 五.动态规划入门 1.动态介绍 1.1动态规划基本思路 1.2 动态规划基本概念 1.2.1 阶段 1.2.2 状态 1.2.3 决策 1.2.4 状态转移方程 1.2.5 策略 1.3 ...
- 动态规划——数塔(hdu2084)
首先介绍一下动态规划: 动态规划(dynamic programming),我们称之为DP,是求最优解的一种很常见的方法. 思想和背包基本一样,如对背包感兴趣的可以移步 http://blog.csd ...
- 55 - 算法 -动态规划 -数塔问题 感觉都是数组建模 递推方法规则
//模板#include <iostream> #include <cstdio> #include <string> using namespace std;/* ...
最新文章
- (七)STM32的RTC简单操作
- Web前端上万字的知识总结
- 老罗直播带货,抖音依然没有准备好和快手、淘宝直播的PK
- CefSharp试用
- JsonData响应工具类封装
- web 前端 如何分享到instagram_如何找到靠谱的Web培训机构?web前端培训机构哪个好?...
- 上海市二级c语言软件环境,上海市2019年9月计算机二级考试复习教程:(C语言)上机考试新版题库+全真模拟试卷(2本装)...
- scratch3.0入门
- 积累分布用例-洛伦兹曲线和随机游走
- [ArcGIS] 空间分析(二) 矢量数据
- 多台机器同步Windows上的文件 -cwRsync 同步问题
- 电线电缆材料stru结构检测知识大全
- TCP/UDP端口列表
- Juniper防火墙之ICMP-Ping
- 华为手机多屏互动功能使用
- iMac 2019一体机开箱体验,其内存是什么牌子,怎样换iMac内存?
- Elasticsearch模块——CRUD
- 功夫茶篇∞潮州工夫茶:通古今之变
- Windows10软件显示模糊解决方案
- 极智开发 | ubuntu 安装有线网卡驱动