NOI 2.6 动态规划 7625:三角形最佳路径问题

xiaoxiao2021-02-28  41

题目来源: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,同时也是最底层边的数字的数目。从第二行开始,每行为三角形相应行的数字,中间用空格分隔。

输出

最佳路径的长度数值。

样例输入

573 88 1 02 7 4 44 5 2 6 518

样例输出

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 }
转载请注明原文地址: https://www.6miu.com/read-2602553.html

最新回复(0)