在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 
 
已经告诉你了,这是个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

动态规划入门_数塔问题相关推荐

  1. 动态规划java实现数塔问题_动态规划入门_数塔问题

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...

  2. python 动态规划 数塔_数塔问题,简单的动态规划算法

    /* 数塔问题: 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走, 一直走到底层,要求找出一条路径,使路径 ...

  3. 动态规划经典题目——数塔问题

    一.题目 数塔问题 :要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 二.解题思路 动态规划解题思路可详见另一篇文章.数塔中元素用二维数组a[][]表示 ①定义状态 ...

  4. 动态规划算法之数塔问题

    package cn.gldwolf.bigdata;/* 3 12 56 23 4 78 34 69 34 19 12 3 54 12 34 *//* 思路:从最底层往上走,判断下层两个节点中的最大 ...

  5. 算法.动态规划 导航/数塔取数字问题

    目录 前言 从1+1开始 总结下概念 地图到图 回头看 代码 动态规划经典问题 前言 下面的概念和公式可能会吓到你,看不懂没关系,就是让你恶心的.反正我看着也挺恶心,专业就是让你看不懂,看懂了怎么能叫 ...

  6. c++ 动态规划(数塔)

    c++ 动态规划(dp) 题目描述 观察下面的数塔.写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大. 每一步可以从当前点走到左下角的点,也可以到达右下角的点. 输入 5 13 ...

  7. LQ训练营(C++)学习笔记_动态规划入门

    动态规划入门 五.动态规划入门 1.动态介绍 1.1动态规划基本思路 1.2 动态规划基本概念 1.2.1 阶段 1.2.2 状态 1.2.3 决策 1.2.4 状态转移方程 1.2.5 策略 1.3 ...

  8. 动态规划——数塔(hdu2084)

    首先介绍一下动态规划: 动态规划(dynamic programming),我们称之为DP,是求最优解的一种很常见的方法. 思想和背包基本一样,如对背包感兴趣的可以移步 http://blog.csd ...

  9. 55 - 算法 -动态规划 -数塔问题 感觉都是数组建模 递推方法规则

    //模板#include <iostream> #include <cstdio> #include <string> using namespace std;/* ...

最新文章

  1. (七)STM32的RTC简单操作
  2. Web前端上万字的知识总结
  3. 老罗直播带货,抖音依然没有准备好和快手、淘宝直播的PK
  4. CefSharp试用
  5. JsonData响应工具类封装
  6. web 前端 如何分享到instagram_如何找到靠谱的Web培训机构?web前端培训机构哪个好?...
  7. 上海市二级c语言软件环境,上海市2019年9月计算机二级考试复习教程:(C语言)上机考试新版题库+全真模拟试卷(2本装)...
  8. scratch3.0入门
  9. 积累分布用例-洛伦兹曲线和随机游走
  10. [ArcGIS] 空间分析(二) 矢量数据
  11. 多台机器同步Windows上的文件 -cwRsync 同步问题
  12. 电线电缆材料stru结构检测知识大全
  13. TCP/UDP端口列表
  14. Juniper防火墙之ICMP-Ping
  15. 华为手机多屏互动功能使用
  16. iMac 2019一体机开箱体验,其内存是什么牌子,怎样换iMac内存?
  17. Elasticsearch模块——CRUD
  18. 功夫茶篇∞潮州工夫茶:通古今之变
  19. Windows10软件显示模糊解决方案
  20. 极智开发 | ubuntu 安装有线网卡驱动

热门文章

  1. 浅谈APP流式分页服务端设计(转)
  2. mybatis表关联彻底理解
  3. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
  4. Apache Log4j 学习笔记
  5. awesome docsify learning notes
  6. 来自长辈的5句教导!
  7. Shadow Mapping 的原理与实践 【转】
  8. 注意区分啊~这里求的的事公共子串不是子序列。NOJ308-Substring
  9. spring + angular 实现导出excel
  10. 阿里云云主机添加swap分区与swap性能优化