2084 数塔HDU

View Code
 1 #include <iostream>//2084 数塔
2 #define max(a,b) (((a) > (b)) ? (a) : (b))
3 #define mx 101
4 using namespace std;
5 int f[mx][mx],a[mx][mx];
6 int fan(int i,int j)
7 {
8 if (f[i][j]!=-1)
9 {
10 return f[i][j];
11 }
12 else
13 return max(f[i+1][j]=fan(i+1,j),f[i][j+1]=fan(i,j+1))+a[i][j];
14 }
15 int main()
16 {
17 int t,n,i,j,l;
18 cin>>t;
19 while(t--)
20 {
21 cin>>n;
22 for(l=2;l<=n+1;l++)
23 for (i=1;i<l;i++)
24 {
25 cin>>a[l-i][i];
26 f[l-i][i]=-1;
27 }
28 for(i=1;i<=n;i++)//初始化f[n]
29 f[n-i+1][i]=a[n-i+1][i];
30 printf("%d\n",fan(1,1));
31 }
32 return 0;
33 }
34 /*
35 1 1
36 2 2 3
37 3 4 5 6
38 4 7 8 9 10
39 5 11 12 13 14
40 9 15 16 17 18 19
41 */
View Code
 1 #include <iostream>//2084 数塔
2 #include<stdio.h>
3 #define max(a,b) (((a) > (b)) ? (a) : (b))
4 using namespace std;
5 int main()
6 {
7 int t,n,i,j,l;
8 int c[5060],a[5060];
9 cin>>t;
10 while(t--)
11 {
12 cin>>n;
13 for (i=1;i<=n*(n+1)/2;i++)
14 {
15 cin>>a[i];
16 }
17 for(j=n*(n-1)/2+1;j<=n*(n+1)/2;j++)//初始化c[n]
18 c[j]=a[j];
19 for (i=n-1;i>0;i--)
20 {
21 l=i*(i+1)/2-i*(i-1)/2;//第i行有l个数
22 for (j=i*(i-1)/2+1;j<=i*(i+1)/2;j++)
23 {
24 c[j]=max(c[j+l],c[j+l+1])+a[j];
25 }
26 }
27 printf("%d\n",c[1]);
28 }
29 return 0;
30 }
31 /*
32 1 1
33 2 2 3
34 3 4 5 6
35 4 7 8 9 10
36 5 11 12 13 14
37 9 15 16 17 18 19
38 */

Problem Description

 

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

你可能感兴趣的:(HDU)