CUC-SUMMER-5-A

A - 数塔
HDU - 2084

在讲述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


解法:动态规划,从倒数第二层往顶层推,可以看出倒数第二层中
b[j]=a[i][j]+max(a[i+1][j],a[i+1][j+1])

代码:

#include<iostream>
using namespace std;
int a[105][105];
int b[105];
int main()
{
    int num;
    cin>>num;
    while(num--){
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            for(int j=0;j<=i;j++)
                cin>>a[i][j];
        for(int i=n-1;i>=0;i--)
            for(int j=0;j<=i;j++)
                if(i==n-1)
                    b[j]=a[i][j];
                else
                    b[j]=max(a[i][j]+b[j],a[i][j]+b[j+1]);
        cout<<b[0]<<endl;
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,788评论 0 33
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,497评论 1 42
  • 前几天阅读了王宇昆的《最坏的结局不过是大器晚成》,其中有一段小诗让我触动很大。 纽约时间比加州时间早3个小时,但加...
    爱读书的李老师阅读 684评论 0 0
  • 回到家已是华灯初上,庆幸还能在落日之前看到最后一抹余晖,还好,今天还不算加班得太晚。饭桌上,忘了聊...
    林小希阅读 333评论 0 0
  • 今天阳光很好,心情不太妙。因为我从出门的那一刻,我的脑袋里就只飘了一个念头:我想离婚。 这叫什么日子么? 如人饮水...
    小猪天堂阅读 213评论 8 1