6Luffy6

导航

[USACO1.5] [IOI1994]数字三角形 Number Triangles

传送锚点

[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;
}

posted on 2024-08-01 10:34  不AC不睡觉  阅读(9)  评论(0编辑  收藏  举报