自己动态规划的第一题,数字三角形

1087: 三角形

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 72   Solved: 40
[ Submit][ Status][ BBS]

Description


3 8 

8 1 0 

2 7 4 4 

4 5 2 6 5 

(图一) 

图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。 
每一步只能由当前位置向左下或右下。

Input

你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试次数。 
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。 
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。

Output

输出每次测试的最大值并且占一行。

Sample Input

1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5

Sample Output

30

HINT

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 105
int a[N][N];
int d[N][N];
int main()
{
     int t;
     scanf ( "%d" ,&t);
     while (t--)
     {
         int n,i,j;
         scanf ( "%d" ,&n);
         memset (d,0, sizeof (d));
         for (i=1;i<=n;i++)
         {
             for (j=1;j<=i;j++)
             {
                 scanf ( "%d" ,&a[i][j]);
             }
         }
         for (i=1;i<=n;i++)
         {
             d[n][i]=a[n][i];
         }
         for (i=n-1;i>=1;i--)
         {
             for (j=1;j<=i;j++)
             {
                 d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
             }
         }
         printf ( "%d\n" ,d[1][1]);
     }
     return 0;
}
 
/**************************************************************
     Problem: 1087
     User: 14311020312
     Language: C++
     Result: Accepted
     Time:1 ms
     Memory:1116 kb
****************************************************************/

你可能感兴趣的:(自己动态规划的第一题,数字三角形)