AcWing題庫898.數字三角形(c++)
阿新 • • 發佈:2021-01-12
給定一個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。
輸入格式
第一行包含整數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
演算法標籤:動態規劃、線性dp
由題可知結果是不斷累加的,所以我選擇從最底層開始選擇最大值累加,選擇最優解。
也就是
arr[i][j]=max(arr[i][j]+arr[i+1][j],arr[i][j]+arr[i+1][j+1]);
AC程式碼
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,arr[501][501];
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1 ;j<=i;j++)
scanf("%d",&arr[i][j]);
}
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++)
arr[i][j]=max(arr[i][j]+arr[i+1][j],arr[i][j]+arr[i+1][j+1]);
printf("%d\n",arr[1][1]);
return 0;
}