传送锚点
[P1216 USACO1.5] [IOI1994]数字三角形 Number Triangles - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目
[USACO1.5] [IOI1994]数字三角形 Number Triangles
题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
在上面的样例中,从 $7 \to 3 \to 8 \to 7 \to 5$ 的路径产生了最大权值。
输入格式
第一个行一个正整数 $r$ ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
输出格式
单独的一行,包含那个可能得到的最大的和。
样例 #1
样例输入 #1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出 #1
30
提示
【数据范围】
对于 $100\%$ 的数据,$1\le r \le 1000$,所有输入在 $[0,100]$ 范围内。
题目翻译来自NOCOW。
USACO Training Section 1.5
IOI1994 Day1T1
思路
输入数据时,我们从下标为1开始,然后我们从上往下递推,转移方程为 ans[i][j] = max(ans[i - 1][j], ans[i - 1][j - 1] ) + num[i][j];
不用担心越界,一开始输入数据时,我们就已经处理了,在输出最大值时,我们要遍历最后一行,
代码
#include <bits/stdc++.h>
typedef long long ll;
const int N = 1e3 + 5;
int num[N][N];
int ans[N][N];
using namespace std;
typedef long long ll;
int main() {
#ifdef ACM_LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
cin >> num[i][j];
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
ans[i][j] = max(ans[i - 1][j], ans[i - 1][j - 1] ) + num[i][j];
}
}
int ret = 0;
for(int j = 1; j <= n; j++){
ret = max(ret, ans[n][j]);
}
cout << ret;
return 0;
}