思路:
這是一道典型的動態規劃問題。(最簡單的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;
}