首页 > 编程语言 > 详细

51Nod一级算法1002数塔取数问题

时间:2017-11-09 23:40:22      阅读:241      评论:0      收藏:0      [点我收藏+]

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

 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("%d\n",a[0]);
22     return 0;
23 }

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

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

51Nod一级算法1002数塔取数问题

原文:http://www.cnblogs.com/luzhiliang/p/7811646.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!