hdu2084数塔问题

题目描述:

数塔

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

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

 

 

 

解题思路:典型的动态规划

 

 

我的代码:#include #include #define MAX_SIZE 110 int main(){ int a[MAX_SIZE][MAX_SIZE]; //原始数据 int sum[MAX_SIZE][MAX_SIZE]; //和 int m,n,i,j,k,p,q; int largest; scanf("%d",&m); for(i=1;i<=m;i++){ scanf("%d",&n); for(j=1;j<=n;j++){ for(k=1;k<=j;k++){ scanf("%d",&a[j][k]); } } for(p=1;p<=n;p++){ sum[n][p] = a[n][p]; } for(p=n-1;p>=1;p--){ for(q=1;q<=p;q++){ if(sum[p+1][q] > sum[p+1][q+1]) largest = q; else largest = q+1; sum[p][q] = a[p][q] + sum[p+1][largest]; } } printf("%d/n",sum[1][1]); } return 0; } 

你可能感兴趣的:(hdu2084数塔问题)