51 nod 1002 數塔取數問題

思路:

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

            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章