1288:三角形最佳路徑問題
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 2578 通過數: 2251
【題目描述】
如下所示的由正整數數字構成的三角形:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,和最大的路徑稱爲最佳路徑。你的任務就是求出最佳路徑上的數字之和。
注意:路徑上的每一步只能從一個數走到下一層上和它最近的下邊(正下方)的數或者右邊(右下方)的數。
【輸入】
第一行爲三角形高度100≥h≥1,同時也是最底層邊的數字的數目。
從第二行開始,每行爲三角形相應行的數字,中間用空格分隔。
【輸出】
最佳路徑的長度數值。
【輸入樣例】
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【輸出樣例】
30
思路:思路:確定狀態(1,1)出發到底層。確定狀態方程和邊界條件。向左:(1,1)->f(i-1,y)+ a[i,j],向右發f(i-1,j-1)+a[i,j]. ,邊界條件:f[1][1] = a[1][1];
#include <iostream>
#include <cstdio>
#define N 200
using namespace std;
int f[N][N], a[N][N];
int ans, n;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++) scanf("%d", &a[i][j]);
f[1][1] = a[1][1];
for(int i = 2; i <= n; i++)
for(int j = 1; j <= i; j++) f[i][j] = max(f[i-1][j], f[i-1][j-1]) + a[i][j];
for(int i = 1; i <= n; i++) ans = max(f[n][i], ans);
printf("%d\n", ans);
return 0;
}