OJ: POJ

题目 ID: 3176

标签: dp

日期: 2026-01-05 10:46

题目解析

就是数字三角形,直接来

代码

cpp
#include <iostream>
#include <algorithm> // for max
#include <vector>

using namespace std;

// 定义最大行数,稍微大一点防止越界
const int MAXN = 355;
int grid[MAXN][MAXN];

int main() {
    // 优化 I/O 速度
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    if (!(cin >> N)) return 0;

    // 1. 读取输入
    // 我们使用 1-based indexing (从下标1开始),方便对应行号
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= i; ++j) {
            cin >> grid[i][j];
        }
    }

    // 2. 动态规划 (自底向上)
    // 从倒数第二行开始 (i = N-1),一直向上处理到第 1 行
    // 每一行的第 j 个元素,看它下一行(i+1)的第 j 个和第 j+1 个,谁大选谁
    for (int i = N - 1; i >= 1; --i) {
        for (int j = 1; j <= i; ++j) {
            // 状态转移方程
            grid[i][j] += max(grid[i+1][j], grid[i+1][j+1]);
        }
    }

    // 3. 输出结果
    // 经过计算,grid[1][1] 存储的就是从顶到底的最大路径和
    cout << grid[1][1] << endl;

    return 0;
}