数字三角形问题(DP第一题)

Posted on 2014-08-04 16:51  LLGemini  阅读(300)  评论(0)    收藏  举报

题目描述 Description

如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大。

输入描述 Input Description

第一行是数塔层数N(1<=N<=100)。

第二行起,按数塔图形,有一个或多个的整数,表示该层节点的值,共有N行。

输出描述 Output Description

输出最大值。

样例输入 Sample Input

5

13

11 8

12 7 26

6 14 15 8

12 7 13 24 11

样例输出 Sample Output

86

分析:

状态转移方程:dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 using namespace std;
 6 const int maxn = 100;
 7 int triangle[maxn][maxn];
 8 int n;
 9 
10 //直接递归效率太低
11 //int func(int i, int j)
12 //{
13 //    return triangle[i][j] + (i == n+1 ? 0: max(func(i+1, j), func(i+1, j+1)));
14 //}
15 
16 //递推计算
17 //int d[maxn][maxn];
18 //int func()
19 //{
20 //    for(int j = 1; j <= n; j++) d[n][j] = triangle[n][j];
21 //    for(int i = n-1; i >= 1; i--)
22 //        for(int j = 1; j <= i; j++)
23 //    {
24 //        d[i][j] = triangle[i][j] + max(d[i+1][j], d[i+1][j+1]);
25 //    }
26 //    return d[1][1];
27 //}
28 
29 //记忆化搜索
30 int d[maxn][maxn];
31 int fnMemorySearch(int i, int j)
32 {
33     if(d[i][j] >= 0)    return d[i][j];
34     return d[i][j] = triangle[i][j] + (i == n ? 0 : max(fnMemorySearch(i+1, j), fnMemorySearch(i+1, j+1)));
35 }
36 
37 
38 int main()
39 {
40     memset(triangle, 0, sizeof(triangle));
41     memset(d, -1, sizeof(d));
42     cin >> n;
43     for(int i = 1; i <= n; i++)
44     {
45         for(int j = 1; j <= i; j++)
46         {
47             cin >> triangle[i][j];
48         }
49     }
50     //int mm = func(1, 1);
51     //int mm = func();
52     int mm = fnMemorySearch(1, 1);
53     cout << mm << endl;
54     return 0;
55 }
View Code