数塔

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 40894    Accepted Submission(s): 24282

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

有两种思路:从上到下,从下到上

1、从下到上:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     int c,f[105][105];
 7     scanf("%d",&c);
 8     while(c--)
 9     {
10         int n;
11         scanf("%d",&n);
12         for(int i=0;i<n;i++)
13         {
14             for(int j=0;j<=i;j++)
15             {
16                 scanf("%d",&f[i][j]);
17             }
18         }
19         for(int i=n-2;i>=0;i--)//从下往上
20         {
21             for(int j=0;j<=i;j++)
22             {
23                 f[i][j]=max(f[i+1][j],f[i+1][j+1])+f[i][j];
24             }
25         }
26         printf("%d\n",f[0][0]);
27     }
28     return 0;
29 }

2、从上到下:

WA做法:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     int c,f[105][105];
 7     scanf("%d",&c);
 8     while(c--)
 9     {
10         int n;
11         scanf("%d",&n);
12         for(int i=0;i<n;i++)
13         {
14             for(int j=0;j<=i;j++)
15             {
16                 scanf("%d",&f[i][j]);
17             }
18         }
19         for(int i=1;i<n;i++)//从上往下
20         {
21             for(int j=0;j<=i;j++)
22             {
23                     f[i][j]=max(f[i-1][j],f[i-1][j-1])+f[i][j];//超出了边界,下标为负
24             }
25         }
26         int m=f[n-1][0];//对最后一行的f值进行扫描,最大的那一个即是结果
27         for(int i=0;i<n;i++)
28             if(f[n-1][i]>m)
29                 m=f[n-1][i];
30         printf("%d\n",m);
31     }
32     return 0;
33 }

所以要限定下标,进行边界处理:

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     int c,f[105][105];
 7     scanf("%d",&c);
 8     while(c--)
 9     {
10         int n;
11         scanf("%d",&n);
12         for(int i=0;i<n;i++)
13         {
14             for(int j=0;j<=i;j++)
15             {
16                 scanf("%d",&f[i][j]);
17             }
18         }
19         for(int i=1;i<n;i++)//从上往下
20         {
21             for(int j=0;j<=i;j++)
22             {
23                  if(j==0)
24                     f[i][j]=f[i][j]+f[i-1][j];
25                  else if(i==j)
26                     f[i][j]=f[i][j]+f[i-1][j-1];
27                  else
28                     f[i][j]=max(f[i-1][j],f[i-1][j-1])+f[i][j];
29             }
30         }
31         int m=f[n-1][0];//对最后一行的f值进行扫描,最大的那一个即是结果
32         for(int i=0;i<n;i++)
33             if(f[n-1][i]>m)
34                 m=f[n-1][i];
35         printf("%d\n",m);
36     }
37     return 0;
38 }

以上的ppt内容引用于nuwp2014暑假集训资料

转载于:https://www.cnblogs.com/2119662736lzj/p/6399714.html

HDU-2084(简单DP)相关推荐

  1. hdu 5464(简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5464 解题思路: 由于p很小,而ai很大,所以先把ai%p,由于ai可能有负数,所以ai=(ai%p+ ...

  2. hdu 1208(简单dp)

    题意:从[1,1]出发到[n,n],每次到达的格子都要按照格子里的数字走.问可以走到终点的数量是多少. 解题思路:简单的递推就可以了... #include<iostream> #incl ...

  3. hdu 1723(简单dp)

    题意:从第1个人把信传到第n个人,每个人最多往后传m个人,问传到第n个人有多少种方案. 解题思路:水题,dp[i]表示传到第i个人有多少种方案,dp[i] += dp[k], i-m <= k ...

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

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

  5. HDU 5375 Gray code (简单dp)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5375 题面: Gray code Time Limit: 2000/1000 MS (Java/Ot ...

  6. hdu 2881(简单dp)

     题意:n*n的矩阵,里面有m个格子是有任务要去完成的,t,x,y表示要在第t秒到达(x,y)的格子完成任务,问你最多可以完成多少 解题思路:简单dp,将时间排个序后就是LIS #include< ...

  7. HDU 1158【简单dp】

    题意:给你一个项目,需要几个月来完成买,同时也给你每个月最少需要的工人数.并且告诉你hiring,firing每个工人的钱数,以及每个月应付每个工人的工资.求项目完成时最小花费. 这是个简单dp,思路 ...

  8. hdu 3016 Man Down(简单线段树简单DP)

    Man Down Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. HDU中一些DP的题目分类

    DP是难点,供自已以后系统学习. 1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做 ...

  10. NUC-ACM/ICPC 寒假训练 简单DP A - G题

    第一题:数塔 HDU - 2084 做法: 从第 i , j 个 节点往下走的最优解可以由从第 i+1,j 个节点往下走的最优解和第i+1,j+1个节点往下走的最优解得出,二者取其优即可. 代码: 记 ...

最新文章

  1. 2022-2028年中国数据中台行业深度调研及投资前景预测报告(全卷)
  2. Android XML pull 解析器
  3. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]
  4. 某马Java架构师实战学习手册
  5. 写代码前的准备,你做好了吗?
  6. webservice采用ssl/https传输
  7. Python生成多个浮点数、二维浮点数
  8. 5月16日亮相!华硕ZenFone 6新旗舰曝光:无刘海全面屏加持
  9. jdk下载--操作系统
  10. 幕墙计算软件_案例BIM在玻璃幕墙参数化设计的应用
  11. 后台代码调用Application Resources
  12. 数字IC设计系列----安装配置虚拟机、安装centos系统
  13. 电容尺寸、封装及PCB库
  14. 复变函数思维导图梳理
  15. 开源电子海图和webGIS
  16. js 56个民族 数据
  17. 【已解决】兼容多个版本CUDA
  18. idea代码编辑CPU使用率飙升100%
  19. 硕盟Type-C智能10合一多功能拓展坞|硕盟Type-C转换器
  20. 日本单次旅游签 简化材料办理 稳定出签

热门文章

  1. ppt设置外观样式_这个3000多页的PPT是如何在1小时内做好的?
  2. genneratorConfig的记录 2021-04-18
  3. 正在启动python的代码补全客户端_Python交互模式下代码自动补全
  4. form提交php怎么接收不到,php form表单post提交获取不到数据,而使用get提交能获取到数据 的解决办法...
  5. 大android 平板,15.6英寸安卓大平板? 阿芙罗S1评测
  6. servlet mysql insert_servlet+mybatis 实现mysql的增删改查实例
  7. php现实的九九乘法,php趣味编程 - php 输出九九乘法
  8. 计算机网关,如何查看计算机的IP地址和网关
  9. index.php后有乱码后缀,phpExcel在线下wamp环境下,正常导出,同样的代码到线上Linux导出文件无法打开,修改文件后缀为.xls后乱码...
  10. pythonutf-8是不是二进制_python集合、字符编码、bytes与二进制