数塔(经典的dp hdu 2084)

数塔(经典的dp hdu 2084)

     题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=2084

数塔

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


Problem Description
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
数塔(经典的dp hdu 2084)_第1张图片
已经告诉你了,这是个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
 

Source
2006/1/15 ACM程序设计期末考试
 
数塔
 1#include<iostream>
 2#include<algorithm>
 3using namespace std;
 4
 5int data[101][101];//保存到节点的路径最大值
 6int a[101][101];//用一维数组保存节点
 7int n;//层数
 8
 9int max(int a,int b)
10{
11    return (a>b?a:b);
12}

13
14void dp()//
15{
16    int i,j;
17    data[1][1]=a[1][1];//第一个节点直接是自己
18    for(i=2;i<=n;i++)
19        for(j=1;j<=i;j++)
20        {
21            data[i][j]=max(data[i-1][j-1],data[i-1][j])+a[i][j];//主要DP代码
22        }

23
24}

25int main()
26{
27    int t,i,j,k;
28    while(cin>>t)//几组数据
29    {
30        for(i=1;i<=t;i++)
31        {
32            memset(data,-1,sizeof(data));//初始化
33            memset(a,-1,sizeof(a));
34            
35            cin>>n;//n行数据
36            //sum=((1+n)*n)/2;//节点的总个数
37
38            for(j=1;j<=n;j++)//输入节点的数据
39            {
40                for(k=1;k<=j;k++)
41                    cin>>a[j][k];//用一维数组
42            }

43            dp();//调用 dp函数
44            int max=data[n][1];
45            for(j=1;j<=n;j++)
46            {
47                if(max<data[n][j])
48                    max=data[n][j];
49            }

50            cout<<max<<endl;
51
52        }

53    }

54    return 0;
55}

你可能感兴趣的:(数塔(经典的dp hdu 2084))