数塔

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之数塔问题)相关推荐

  1. HDU -- 2084 数塔(简单DP)

    HDU -- 2084  数塔 题意: 自上而下,选择一条累计和最大的路径 分析: 顶点只与左右两个子节点相关,且子节点路径的选择与顶点无关(无后效性) 状态dp[i][j]:表示(i,j)点向下得到 ...

  2. HDU 2084 数塔 DP

    http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目: 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走 ...

  3. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

  4. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  5. POJ - 2342 Anniversary party(树形dp入门)

    题目链接:点击查看 题目大意:每个人都有一个快乐值,给定一个树状的从属关系,仅当上司和下属都不在的时候这个个人的快乐值才能表现出来,问怎么样才能让整体的快乐值达到最大 题目分析:做线段树做吐了,来换换 ...

  6. hdu 2089 数位dp入门

    HDU 2089 题意:中文题 思路:数位dp入门题 AC代码: #include "iostream" #include "string.h" #includ ...

  7. SCU - 1114 数字三角(dp入门ing)

    SCU - 1114 数字三角(dp入门ing) 下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大. 7 3 8 8 1 0 2 7 4 4 1. 每一步可 ...

  8. 数位dp入门题 洛谷P2657 [SCOI2009] windy 数

    题干 传送门 windy 定义了一种 windy 数. 题目描述 不含前导零且相邻两个数字之差至少为 2的正整数被称为 windy 数.windy 想知道,在 a 和 b 之间,包括 a 和 b ,总 ...

  9. 【树形DP】树形DP入门详解+例题剖析

    树形DP 树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上.整体的思路大致就是用树形的结构存储数据. 要学树形DP之前肯定是要先学会树和图的呀,至少先学会链式前向星,不会的话可以看一下我 ...

最新文章

  1. 探偵ガリレオーくさる3
  2. 一款标注颜色,距离的小软件 markman
  3. 抢票神器成GitHub热榜第一,支持候补抢票,Python跑起来 | 标星8400
  4. Spark MaprLab-Auction Data分析
  5. 二叉树的三种遍历(递归与非递归) + 层次遍历
  6. 查询oracle数据库里面所有的表名
  7. 李佳琦、薇娅联手“封杀”巴黎欧莱雅:暂停与其一切合作
  8. netty应用场景_彻底搞懂 netty 线程模型
  9. DataWindow修改的单元格文字颜色改变
  10. PDF怎么在线合并为一个文件
  11. Android3dtouch xposed,你不应错过的 8 款优秀 Xposed 模块 2015 年度盘点
  12. Pandoc 安装与使用
  13. 使用itext和freemarker来根据Html模板生成PDF文件,加水印、印章
  14. NFS4.1规范研究:session
  15. 【渝粤教育】电大中专电子商务网站建设与维护 (5)作业 题库
  16. 苹果 macbookpro m2 pro、m2 max、m1 pro和 m1 max区别
  17. android闹钟铃声编码,Android 设置来电铃声、通知铃声、闹钟铃声中的坑
  18. 【C++】STL简介
  19. pytorch 中 混合精度训练(真香)
  20. 从古代文学到云端技术

热门文章

  1. 地图弹框选择地点,返回经纬度
  2. 【转】Android自适应不同分辨率或不同屏幕大小的layout布局(横屏|竖屏)
  3. 杜比全景声深受好莱坞青睐
  4. Codeforces 575C 状压+KM
  5. erlang游戏源码--英雄远征分析
  6. 朴素贝叶斯+语言模型
  7. Suricata IPS-NFQ模式
  8. 2009年世界顶级杀毒软件排行榜
  9. 网页加载很慢时如何分析原因
  10. 【Python】2D/3D框IOU简单计算方法