思路:
这是一道典型的动态规划问题。(最简单的DP)
考虑从底层的结点开始计算。【假定从上往下的层数记为:1-N】
第i层走到第i+1层取决于 第i+1层结点的最大值。
具体实现时 用一个一维数组保存从底往上的结果,可以减小空间复杂度。
注:本文给出的算法时间复杂度 O(n)
#include <queue>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <cmath>
#include<algorithm>
#define Max(a,b) ((a) > (b) ? (a) :(b))
using namespace std;
int main(){
int n,m,i,k,j;
//输入塔的层数
scanf("%d",&n);
// n层塔总共有多少个数
k = (1 + n) * n / 2;
// 记录所有数的动态数组
int *a = (int*)malloc(sizeof(int) * k);
// 输入每个塔结点的数
for(i = 0 ; i < k; i++)
{
scanf("%d", a + i);
}
// 从倒数第二层的结点开始
k = k - n;
// 若按照从上到下 从左到右的次序对结点计数
// 从倒数第二层的最后一个结点开始 决策往左还是往右
for(i = k - 1 , j = 0 ; i >= 0; i--)
{
a[i] = a[i] + Max(a[i+n], a[i+n-1]);
// 遍历完一层的结点
if(++j == n - 1)
{
n--;
j = 0;
}
}
printf("%d\n",a[0]);
return 0;
}