数塔

在讲述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
一道简单DP
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define MAX 105
 5 
 6 int main()
 7 {
 8     int n;
 9     int tri[MAX][MAX];  //存放三角形数据
10     int maxNum[MAX];    //存放每个子问题的最大数
11     int c;
12     int i,j,k;
13     scanf("%d",&c);
14     for (k=0; k<c; k++)
15     {
16       scanf("%d",&n);
17       for (i=1; i<=n; i++)
18         for (j=1; j<=i; j++)
19           scanf("%d",&tri[i][j]);
20       for (i=1; i<=n; i++)
21         maxNum[i] = tri[n][i];
22       for (i=n; i>1; i--)
23         for (j=1; j<i; j++)
24         {
25           if (maxNum[j]>maxNum[j+1])
26             maxNum[j] += tri[i-1][j];
27           else
28             maxNum[j] = maxNum[j+1]+tri[i-1][j];
29         }
30       printf("%d
",maxNum[1]);
31     }
32     return 0;
33 }
蒹葭苍苍,白露为霜; 所谓伊人,在水一方。
原文地址:https://www.cnblogs.com/huwt/p/9986292.html