Description
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。
在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。
Input
第一个行包含R(1≤ R≤1000),表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
Output
单独的一行,包含那个可能得到的最大的和。
Sample Input 1
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
Sample Output 1
86
题解
这道题是一道dp入门题,主要目的是熟悉这个过程。
主要分析下样例。。QAQ。
虽然这个样例看起来像是一个图,但其实这道题并不需要用到图论的知识。。
首先,从输入样例可以看出,我们输入的这一堆数据是这样的:
(我去,居然传不了图。。。。)
递推式为:dp[ i ][ j ] = max(dp[ i - 1][ j ], dp[ i - 1][ j - 1]) + a[ i ][ j ];
AC代码
#include<iostream>
using namespace std;
int n;
int a[1147][1147];
int dp[1147][1147];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> a[i][j];
}
}
dp[1][1] = a[1][1];
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j];
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(dp[n][i], ans);
}
cout << ans;
return 0;
}