【问题描述】
给定一个数塔,如下图所示。在此数塔中,从顶部出发,在每一节点可以选择走左下或右下,一直走到底层。请找出一条路径,使路径上的数值和最大。
9 | ||||||||
12 | 15 | |||||||
10 | 6 | 8 | ||||||
2 | 18 | 9 | 5 | |||||
19 | 7 | 10 | 4 | 16 |
【输入形式】
输入时第一行一个整数n,表示该数塔的行数,其余n行表示该塔每行的数值
【输出形式】
输出包含两行,第一行为最大路径上的数值之和, 第二行n个数字为从上而下最大路径数值
【样例输入】
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
【样例输出】
59
9 12 10 18 10
#include <bits/stdc++.h>
using namespace std;
int a[50][50], b[50][50], n;
int largepath(int u, int v)
{
if (b[u][v]==-1) {
if (u==n-1) b[u][v]=a[u][v];
else b[u][v] = a[u][v]+max(largepath(u+1, v), largepath(u+1, v+1));
}
return b[u][v];
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i+1; j++) {
cin >> a[i][j]; b[i][j]=-1;
}
}
cout << largepath(0, 0) << endl;
int x = b[0][0], *p, r;
for (int i = 0; i < n; i++) {
p = find(b[i], b[i]+50, x);
r = a[i][p-&b[i][0]];
cout << r << ' ';
x-=r;
}
return 0;
}