1. 程式人生 > 其它 >AcWing 898. 數字三角形(線性DP)

AcWing 898. 數字三角形(線性DP)

題目連結


題目描述

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

題目模型

  • 集合表示:f(i,j)
  • 集合含義:所有從(1,1)走到(i,j)的路線
  • 集合屬性:max
  • 集合劃分:

題目關鍵

劃定座標軸:


題目程式碼

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

using namespace std;

const int N = 510, INF = 1e9;

int n;
int f[N][N];
int w[N][N];

int main()
{
    scanf("%d", &n);
    
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= i; j ++ )
            scanf("%d", &w[i][j]);
            
    memset(f, -0x3f, sizeof f);
    
    f[1][1] = w[1][1];
    for(int i = 2; i <= n; i ++ )
        for(int j = 1; j <= n; j ++ )
            f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + w[i][j];
    
    int res = -INF;
    for(int i = 1; i <= n; i ++ )
        res = max(res, f[n][i]);
    
    printf("%d\n", res);
    
    return 0;
}