1. 程式人生 > 實用技巧 >一道DP題(898.數字三角形)

一道DP題(898.數字三角形)

From Acwing

給定一個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。

輸入格式

第一行包含整數n,表示數字三角形的層數。

接下來n行,每行包含若干整數,其中第 i 行表示數字三角形第 i 層包含的整數。

輸出格式

輸出一個整數,表示最大的路徑數字和。

資料範圍

1≤n≤500,
−10000≤三角形中的整數≤10000

輸入

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

輸出

30

程式碼

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=510;
int n,w[N][N],f[N][N];

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>w[i][j];
        }
    }
    for(int i=1;i<=n;i++) f[n][i]=w[n][i];
    
    for(int i=n-1;i;i--){
        for(int j=1;j<=i;j++){
            f[i][j]=max(f[i+1][j],f[i+1][j+1])+w[i][j];
        }
    }
        
    cout << f[1][1] << endl;
    
    return 0;
}