---恢复内容开始---

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define max(x,y) ((x)>(y)?(x):(y))
 4 int main(){
 5     int n;
 6     int i,j,k;
 7     scanf("%d",&n);//层数
 8     k = (n+1)*n/2;//所有节点总数
 9     int *a = (int*) malloc(sizeof(int) * k);//动态数组,记录每个节点的数
10     for(i = 0; i < k; i++){//输入各个节点数
11         scanf("%d",&a[i]);
12     }
13     k -= n;//倒数第二层的第一个节点
14     for(i = k-1, j = 0; i>= 0 ; i--){
15         a[i] = a[i] + max(a[i+n],a[i+n-1]);//贪心,将下层的左or右节点的最大值加到自身
16         if(++j == n-1){//遍历完一层就n-1
17             n--;
18             j = 0;
19         }
20     }
21     printf("%dn",a[0]);
22     return 0;
23 }

思路:从倒数第二行开始,每个节点的值加上它下一层的左右节点的最大值,然后逐层向上遍历,直到顶点,循环结束,输出顶点内容

---恢复内容结束---

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!