从“数字金字塔”说起
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。
在上面的样例中,13 -> 8 -> 26 -> 15 -> 24的路径得到的和最大:86。
解题
- 我们要在所有路径中,找到经过数字之和的最大值。每条路径都是可逆的,同一条路径,从上往下和从下往上,得到的数字之和是相同的。
- 如果自上而下枚举的话,到第 n 行将得到 n 个数字,还需要再打擂台找最大值,多出一个步骤。我们采用自下而上枚举,到第一行就得到唯一的结果。
- 约定用
f[i][j]
表示从第 n 行的某一列出发,到达第 i 行第 j 列的所有路径中数字之和的最大值, 要到达第 i 行第 j 列的位置,只有经过第 i + 1 行第 j 列,或者第 i + 1行第 j + 1列,也就是说
f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j];
- 递推到第 1 行第 1 列时,
f[1][1]
就是题目所求的最优路径的数字之和
这是完整代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1009;
int n, a[N][N];
int f[N][N];
int main() {
cin >> n;
for (int i = 1; i <= n