动态规划入门_数塔问题
时间:2022-07-25
本文章向大家介绍动态规划入门_数塔问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
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 ];
- Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用
- 这或许是对小白最友好的python入门了吧——4,列表
- 每个人都应该知道的十个机器学习常识
- 重新带你了解React.js
- WebService又一个不爽的地方
- 劲爆!小程序又增新功能!为落地微信智慧零售方案做铺垫!
- 5G光传送网技术
- 突破封闭 Web 系统的技巧之正面冲锋
- 建立本地的Blast数据库
- [biztalk笔记]-1.Hello World!
- 人工智能对政府意味着什么
- 利用Linq对集合元素合并、去重复处理
- 上高速就开启自动驾驶,但出车祸了!自动驾驶真不敢用哦!
- Gof设计模式之建造者模式(二)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 技术篇-3行代码实现语音朗读,pywin32库实现语音朗读
- Java并发编程(2)- 线程安全性详解
- Python 技术篇-1行代码实现语音识别,speech库快速实现简单的语音对话
- linux和windows互传文件,用户配置文件和密码配置文件,用户组和用户管理
- 除Innodb和MyISAM外MySQL还有哪些存储引擎
- MySQL自身对性能的影响
- Python 技术篇-用pywin32库实现读写剪贴板
- Excel 技巧篇-在指定范围内生成指定小数位的随机数
- PyQt5 技巧篇-窗口置顶设置,如何使窗口始终显示在最前面
- 解决npm install时报错无法安装chromedriver的问题
- 解决集成jpa时无法创建entityManagerFactory的问题
- Spring船新版推出的WebFlux,是兄弟就来学我
- JDK9特性-Reactive Stream 响应式流
- Java函数式编程之Stream流编程
- 使用docker安装elasticsearch伪分布式集群以及安装ik中文分词插件