POJ 1163 The Triangle
这一题就是典型的动态规划,从数塔的底部开始用dp[i][j]表示到第i行第i个数的时候数塔的最大值,转移方程为dp[i][j] = dp[i][j] + max{dp[i + 1][j], dp[i + 1][j + 1]}, 显然最后结果为dp[1][1]。
AC code:
1 #include <iostream>
2 #define MAX 500
3 using namespace std;
4 int n;
5 int tri[MAX][MAX];
6 int d[MAX][MAX];
7
8 void input()
9 {
10 for(int i = 1; i <= n; i++)
11 for(int j = 1; j <= i; j++)
12 scanf("%d", &tri[i][j]);
13 }
14 int get_max(int a, int b)
15 {
16 return a > b ? a : b;
17 }
18 int sum(int i, int j)
19 {
20 if(d[i][j] >= 0)return d[i][j];
21 return d[i][j] = tri[i][j] + (i == n ? 0: get_max(sum(i + 1, j), sum(i + 1, j + 1)));
22 }
23 int main()
24 {
25 while(scanf("%d", &n) != EOF)
26 {
27 input();
28 memset(d, -1, sizeof(d));
29 printf("%d\n", sum(1, 1));
30 }
31 return 0;
32 }
 
                    
                 
