问题 B: 数塔问题
题目描述
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
输入
第一行是一个整数N(1 <= N <= 20),表示数塔的高度,接下来用N个数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
输出
输出可能得到的最大和,每个实例的输出占一行。
样例输入
5
9 12 15 10 6 8 2 18 9 5 19 7 10 4 16
样例输出
max=59
题目分析:
我们可以看出来,这道题目如果使用贪心算法不能保证找到真正的最大和。
所以我们在选择用动态规划的时候,考虑数塔问题时可以自上向下的分析,自底向上的计算。
算法实现:首先利用一个二维数组a[100][100]存储数塔的原始数据(只用下三角形矩阵),然后利用一个中间数组f[100][100]存储每一次决策过程中的结果(也是一个下三角矩阵)。
初始化f数组,先将a数组的最后一层拷贝到f中。接下来,再让f数组的每一层等于f数组下一层中两个数中最大的数,代码为:f[i][j] = max(f[i+1][j], f[i+1][j+1]) + a[i][j],最后我们想要的结果就保存在f[0][0]中。
对于上面的数塔,我们的a数组如下:
9 | ||||
12 | 15 | |||
10 | 6 | 8 | ||
2 | 18 | 9 | 5 | |
19 | 7 | 10 | 4 | 16 |
f数组如下
59 | ||||
50 | 49 | |||
38 | 34 | 29 | ||
21 | 28 | 19 | 21 | |
19 | 7 | 10 | 4 | 16 |
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){int a[100][100],f[100][100];int n,i,j;cin>>n;for(i=1;i<=n;i++){for(j=1;j<=i;j++){cin>>a[i][j];}}for(i=n;i>=1;i--){for(j=1;j<=i;j++){f[i][j] = max(f[i+1][j],f[i+1][j+1])+a[i][j];}}cout<<"max="<<f[1][1];
}
问题 B: 数塔问题相关推荐
- HDU 2084 数塔(DP)(JAVA版)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- HDU-2084 数塔 经典dp,水
1.HDU-2084 数塔 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 3.总结:从下往上推,最后归于顶点.方程为 dp[i][j] ...
- HDOJ_ACM_数塔
Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...
- HDU -- 2084 数塔(简单DP)
HDU -- 2084 数塔 题意: 自上而下,选择一条累计和最大的路径 分析: 顶点只与左右两个子节点相关,且子节点路径的选择与顶点无关(无后效性) 状态dp[i][j]:表示(i,j)点向下得到 ...
- HDU 2084 数塔 DP
http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目: 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走 ...
- 数塔(杭电2084)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- c++ 动态规划(数塔)
c++ 动态规划(dp) 题目描述 观察下面的数塔.写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大. 每一步可以从当前点走到左下角的点,也可以到达右下角的点. 输入 5 13 ...
- HD 2048 数塔 DP(简单递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...
- 动态规划入门_数塔问题
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP ...
- hdu 1176 dp 数塔问题
哎,一开始没看到从5开始.... 后来写懵了,用了queue正推,记录能到达的节点,p[i+1][j] = max(p[i][j],max(p[i][j-1],p[i][j+1])) 嗯,用stl m ...
最新文章
- Javascript单线程实现
- PHP的Session机制
- aliyun maven 添加jar_gradle添加阿里云maven库
- Qt文档阅读笔记-编写应用脚本解析与实例
- opencv配置中常见问题
- oracle 错误代码问题处理经验汇总
- EXT2文件系统简介
- JAVA中SSH框架
- git 强制回滚到某个commit版本
- 冰蝎各版本工具分析与魔改思路
- Spring Boot普通参数与基本注解
- 三年磨一剑大话数据结构——数据结构起源、概念和术语
- 韦根w34是多少位_Levi's裤子尺码中的W34和L34各是多少厘米?
- 记忆化搜索 (蒟蒻练习生)
- 创业公司如何划分股份
- NE555使用的一些心得
- Android 圆形图片 CircleImageView(Xfermode方式)
- 与iOS的初吻---方法命名与调用
- CTF网络安全大赛 Crypto boom
- 19年计算机英语统考,抓紧!2019年上半年全国计算机等级考试、全国英语等级考试报名即将截止...
热门文章
- 织梦网站翻页php,dedecms织梦网站列表页和内容页分页样式
- [转]5分钟实现Android中更换头像功能
- [转]浅谈CMD和win powershell的区别
- C和指针之动态内存分配malloc、calloc、realloc简单使用和区别
- Android系统手机端抓包方法(tcpdump)
- C# 实现Winform全屏后不遮挡任务栏,显示任务栏
- linux重新做yum,Linux 系统 Centos 7.7 下重装yum
- linux系统多网口聚合配置,Linux网卡聚合linux多网卡绑定聚合之bond模式的原理是什么...
- springboot springcloud区别_SpringCloud微服务全家桶-第一篇!为什么要用微服务
- 一所传闻要被“降级”的211高校,让这位网红教授“救活了”