TKO 6-2 DP入门之2084(基本dp之数塔问题)
数塔
Problem Description
在讲述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
这是一个最最基本的DP题目,如果这个DP掌握不好或者没有感觉,DP相当于没学。
详细解析:
举个例子,如果想知道五层的最大和,
即想要知道dp[0][0]+max(左子树,右子树),
那么知道max(左子树,右子树)即可;
若果想知道左子树或者右子树的最大和,
那么只要知道他们两个子树的最大值即可。
以此类推,运用地推思想,
写出状态转移方程:
dp[i][j]=a[i][j]+max(dp[i][j-1],dp[i+1][j-1]);
那么,我们将得到一个非常便捷的编程方法:
这是一个最最基本的双数组DP实现方案
//温馨提示: The time limited
#include<bits/stdc++.h>
using namespace std;
#define k 101
int a[k][k];
int dp[k][k];
int f(int x);
int main()
{
int n,m,ret;
while(scanf("%d",&n))
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
while(n–)
{
scanf("%d",&m);
for(int i=0;i<m;i++)
for(int j=0;j<=i;j++)
scanf("%d",&a[i][j]);
if(m==1)
ret=a[0][0];
else
ret=f(m);
printf("%d\n",ret);
}
}
}
int f(int x)
{
int r;
for(int i=0;i<x;i++)
dp[x-1][i]=a[x-1][i];
for(int i=x-2;i>=0;i–)
{
for(int j=0;j<=i;j++)
{
dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
r=dp[i][j];
}
}
return r;
}
/令人扫兴的是,这个代码其实是不能ac的,因为他超时乐乐了;
所以我们需要节约运行时间,
参考以下代码,将两个数组合并为一个数组,以此达到目的
AC代码如下:/
#include
#include
//这里用万能头也行
using namespace std;
int main()
{
int m,n;
int i,j;
int num[101][101];
while(cin>>n)
{
while(n–)
{
cin>>m;
for(i=0;i<m;i++)
for(j=0;j<=i;j++)
cin>>num[i][j];
for(i=m-1;i>0;i–)
{
for(j=0;j<i;j++)
{
num[i][j]=max(num[i][j],num[i][j+1]);
//同行相邻两个比较,直接将数组本身改变,方便下一步操作。
num[i-1][j]+=num[i][j];//大的和前一行的第j个相加
}
}
cout <<num[0][0]<<endl;
}
}
return 0;
}
所以,综上所述DP最重要的还是对于问题的***
分析能力、递推思想和简化问题
***的思想;
其次就是所谓的状态转移方程。
描述的是整个问题本质所透露出来的问题;
反应的也是整个代码的实质和功能。
TKO 6-2 DP入门之2084(基本dp之数塔问题)相关推荐
- HDU -- 2084 数塔(简单DP)
HDU -- 2084 数塔 题意: 自上而下,选择一条累计和最大的路径 分析: 顶点只与左右两个子节点相关,且子节点路径的选择与顶点无关(无后效性) 状态dp[i][j]:表示(i,j)点向下得到 ...
- HDU 2084 数塔 DP
http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目: 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走 ...
- 树形DP入门题目推荐以及解析
关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...
- hdu_Anniversary party_(树形DP入门题)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...
- POJ - 2342 Anniversary party(树形dp入门)
题目链接:点击查看 题目大意:每个人都有一个快乐值,给定一个树状的从属关系,仅当上司和下属都不在的时候这个个人的快乐值才能表现出来,问怎么样才能让整体的快乐值达到最大 题目分析:做线段树做吐了,来换换 ...
- hdu 2089 数位dp入门
HDU 2089 题意:中文题 思路:数位dp入门题 AC代码: #include "iostream" #include "string.h" #includ ...
- SCU - 1114 数字三角(dp入门ing)
SCU - 1114 数字三角(dp入门ing) 下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大. 7 3 8 8 1 0 2 7 4 4 1. 每一步可 ...
- 数位dp入门题 洛谷P2657 [SCOI2009] windy 数
题干 传送门 windy 定义了一种 windy 数. 题目描述 不含前导零且相邻两个数字之差至少为 2的正整数被称为 windy 数.windy 想知道,在 a 和 b 之间,包括 a 和 b ,总 ...
- 【树形DP】树形DP入门详解+例题剖析
树形DP 树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上.整体的思路大致就是用树形的结构存储数据. 要学树形DP之前肯定是要先学会树和图的呀,至少先学会链式前向星,不会的话可以看一下我 ...
最新文章
- 探偵ガリレオーくさる3
- 一款标注颜色,距离的小软件 markman
- 抢票神器成GitHub热榜第一,支持候补抢票,Python跑起来 | 标星8400
- Spark MaprLab-Auction Data分析
- 二叉树的三种遍历(递归与非递归) + 层次遍历
- 查询oracle数据库里面所有的表名
- 李佳琦、薇娅联手“封杀”巴黎欧莱雅:暂停与其一切合作
- netty应用场景_彻底搞懂 netty 线程模型
- DataWindow修改的单元格文字颜色改变
- PDF怎么在线合并为一个文件
- Android3dtouch xposed,你不应错过的 8 款优秀 Xposed 模块 2015 年度盘点
- Pandoc 安装与使用
- 使用itext和freemarker来根据Html模板生成PDF文件,加水印、印章
- NFS4.1规范研究:session
- 【渝粤教育】电大中专电子商务网站建设与维护 (5)作业 题库
- 苹果 macbookpro m2 pro、m2 max、m1 pro和 m1 max区别
- android闹钟铃声编码,Android 设置来电铃声、通知铃声、闹钟铃声中的坑
- 【C++】STL简介
- pytorch 中 混合精度训练(真香)
- 从古代文学到云端技术