1. 程式人生 > 實用技巧 >C - 數字三角形問題

C - 數字三角形問題

Description

給定一個由n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。
對於給定的由n行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大值。

Input

輸入資料的第1行是數字三角形的行數n,1≤n≤100。接下來n行是數字三角形各行中的數字。所有數字在0..99之間。

Output

輸出資料只有一個整數,表示計算出的最大值。

Sample

Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Output

30
題解:可以從底層開始向上累加,從第n-1層開始,到達當前位置(i,j)下一層的座標為(i+1,j)或(i+1,j+1),故方程為 dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + dp[i][j];

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int main()
{
    /**
    * dp儲存輸入的數字三角形,後面是儲存累加到當前座標路徑的最大值。
    */
    int dp[105][105];
    int n,i,j;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<=i;j++)
            scanf("%d",&dp[i][j]);
    /**
    *從底層開始向上累加,選取最大值。
    */
    for(i=n-2;i>=0;i--){
        for(j=0;j<=i;j++){
            dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + dp[i][j];
        }
    }
    printf("%d\n",dp[0][0]);
    return 0;
}