NOI 2.6 動態規劃 7625:三角形最佳路徑問題
阿新 • • 發佈:2019-02-05
題目來源:http://noi.openjudge.cn/ch0206/7625/
7625:三角形最佳路徑問題
總時間限制: 1000ms 記憶體限制: 65536kB
描述
如下所示的由正整數數字構成的三角形:
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
或
1
8
樣例輸出
30
或
8
-----------------------------------------------------
解題思路
動態規劃
dp[i][j] =max(dp[i-1][j-1], dp[i-1][j]) + a[i][j]
-----------------------------------------------------
程式碼
#include<iostream> #include<fstream> using namespace std; int main() { #ifndef ONLINE_JUDGE ifstream fin("0206_7625.txt"); int n,i,j; fin >> n; int *dp = new int[n+1](); int *dp0 = new int[n+1](); int *a = new int[n+1](); for (i=1; i<=n; i++) { for (j=1; j<=i; j++) { fin >> a[j]; if (j==1) { dp[j] = dp0[j]+a[j]; } else { dp[j] = (dp0[j-1]>dp0[j]?dp0[j-1]:dp0[j])+a[j]; } } for (j=1; j<=i; j++) { dp0[j] = dp[j]; } } fin.close(); int mymax = 0; for (i=1; i<=n; i++) { mymax = mymax>dp[i]?mymax:dp[i]; } cout << mymax; return 0; #endif #ifdef ONLINE_JUDGE int n,i,j; cin >> n; int *dp = new int[n+1](); int *dp0 = new int[n+1](); int *a = new int[n+1](); for (i=1; i<=n; i++) { for (j=1; j<=i; j++) { cin >> a[j]; if (j==1) { dp[j] = dp0[j]+a[j]; } else { dp[j] = (dp0[j-1]>dp0[j]?dp0[j-1]:dp0[j])+a[j]; } } for (j=1; j<=i; j++) { dp0[j] = dp[j]; } } int mymax = 0; for (i=1; i<=n; i++) { mymax = mymax>dp[i]?mymax:dp[i]; } cout << mymax; #endif }