HDU 2084 数塔 动态规划

解题报告:

题目大意:给定一个有N层的数塔,数塔的第i层有i个数,从数塔的第一层出发,每次只能经过相邻的两条路,求走到最底层时走过的那条路线上的数的和最大是多少?

典型的动态规划,一看到这题,毫不犹豫的用了递归写,测试也过了,但交上去就WA了,才知道,递归调用函数是很花时间的,后来改成直接用for循环,46s就过了。

递归的公式是map[i][j]+=(map[i+1][j]>map[i+1][j+1]? map[i+1][j]:map[i+1][j+1]);就是说当我现在在第i层的第j个数的时候,这个位置可以由第i+1层第j个或者第i+1层第j+1个得到,这就比较一下,这两种走法,哪种走法的和大一点就选择哪一种走法,这样最后返回map[1][1]就是我们要的最大的和。

 1 #include<cstdio>
 2 int map[105][105],T,N;
 3 int dfs() {
 4     for(int i=N-1;i>=1;--i)
 5     for(int j=1;j<=i;++j)
 6     map[i][j]+=(map[i+1][j]>map[i+1][j+1]? map[i+1][j]:map[i+1][j+1]);
 7     return map[1][1];
 8 }
 9 int main() {
10     scanf("%d",&T);
11     while(T--) {
12         scanf("%d",&N);
13         for(int i=1;i<=N;++i)
14         for(int j=1;j<=i;++j)
15         scanf("%d",&map[i][j]);
16         printf("%d\n",dfs());
17     }
18     return 0;
19 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3100344.html