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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod一级算法1002数塔取数问题相关的知识,希望对你有一定的参考价值。

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

 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数塔取数问题的主要内容,如果未能解决你的问题,请参考以下文章

51Nod 1002 数塔取数问题

51Nod 1002 数塔取数问题

1002 数塔取数问题

数塔取数

动态规划&数塔取数&矩阵取数&背包问题&最大子段和&正整数分组

51NOD 1083 矩阵取数问题