当前位置: 首页 > news >正文

题解:AcWing 898 数字三角形

【题目来源】

AcWing:898. 数字三角形 - AcWing题库

【题目描述】

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

        73   88   1   02   7   4   4
4   5   2   6   5

【输入】

第一行包含整数 ,表示数字三角形的层数。

接下来 \(n\) 行,每行包含若干整数,其中第 \(i\) 行表示数字三角形第 \(i\) 层包含的整数。

【输出】

输出一个整数,表示最大的路径数字和。

【输入样例】

5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

【输出样例】

30

【解题思路】

image

【算法标签】

《AcWing 898 数字三角形》 #动态规划# #线性DP#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 510, INF = 1e9;  // 三角形的层数最大500,INF表示无穷大int w[N][N];  // w[i][j]存储三角形的值
int n;        // 三角形的层数
int f[N][N];  // f[i][j]表示从(1,1)走到(i,j)的最大路径和int main()
{// 初始化数组memset(w, 0, sizeof(w));// 读入三角形的层数cin >> n;// 读入三角形的数值for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){cin >> w[i][j];}}// 因为有负数,初始化f数组为负无穷// 注意:三角形的边界也需要初始化for (int i = 0; i <= n; i++){for (int j = 0; j <= i + 1; j++)  // 注意边界:三角形外多初始化一圈{f[i][j] = -INF;}}// 初始化起点f[1][1] = w[1][1];// 动态规划计算每个位置的最大路径和for (int i = 2; i <= n; i++)          // 从第2层开始{for (int j = 1; j <= i; j++)     // 第i层有i个位置{// 状态转移方程:// 从左上角(f[i-1][j-1])或正上方(f[i-1][j])走到当前位置f[i][j] = max(f[i-1][j-1], f[i-1][j]) + w[i][j];}}// 在最后一行中寻找最大路径和int ans = -INF;for (int i = 1; i <= n; i++){ans = max(ans, f[n][i]);}cout << ans;return 0;
}
//从下往上
#include <bits/stdc++.h>
using namespace std;const int N = 510, INF = 1e9;  // 三角形的层数最大500,INF表示无穷大int w[N][N];  // w[i][j]存储三角形的值
int n;        // 三角形的层数
int f[N][N];  // f[i][j]表示从(i,j)走到最底层的最大路径和int main()
{// 注意:这里memset的使用有误// memset(w, 0, sizeof(0));  // sizeof(0)应该是sizeof(w)// 应该改为:memset(w, 0, sizeof(w));// 读入三角形的层数cin >> n;// 读入三角形的数值for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){cin >> w[i][j];}}// 自底向上动态规划// 1. 初始化最后一行for (int i = 1; i <= n; i++){f[n][i] = w[n][i];  // 最后一行到底部的路径就是自身}// 2. 从倒数第二行开始向上递推for (int i = n - 1; i >= 1; i--)  // 从下往上{for (int j = 1; j <= i; j++)  // 第i行有i个位置{// 状态转移方程:// 从当前位置(i,j)可以走到下一行的左下方(i+1,j)或右下方(i+1,j+1)f[i][j] = max(f[i+1][j+1], f[i+1][j]) + w[i][j];}}// 输出结果:从顶部到底部的最大路径和cout << f[1][1];return 0;
}

【运行结果】

5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5
30
http://www.jsqmd.com/news/409976/

相关文章:

  • 题解:AcWing 899 编辑距离
  • zerofs 支更多兼容s3服务了
  • 十家品牌全案公司推荐:大定位理论+年度全案陪跑(避坑攻略) - 品牌排行榜
  • JAVA面试题速记-mysql基础
  • 题解:AcWing 5 多重背包问题 II
  • 题解:AcWing 9 分组背包问题
  • 题解:AcWing 4 多重背包问题 I
  • 莱博雷生Lemborexant治疗失眠症的标准睡前给药方案与次日嗜睡风险评估
  • 七里海潮汐表查询2026-02-26
  • 题解:AcWing 894 拆分-Nim游戏
  • 题解:AcWing 892 台阶-Nim游戏
  • Photoroom 2026.08.04 | 法国大厂出品,高质量无限AI生图,最强电商作图
  • 随心听书 2.0.2 | 电子书听书神器,内置微软语音,堪比真人
  • stm32死锁是怎么实现的
  • stm32最级别的烧录解锁是什么?
  • Agentic AI:自主决策的新范式
  • 2026优质的汽车涂装废水处理企业推荐 - 品牌排行榜
  • 2026哪个品牌的袋式过滤器好?行业口碑推荐 - 品牌排行榜
  • Microsoft Agent Framework 取出 DeepSeek 思考内容
  • 从基础到实战:Java全栈开发工程师的面试实录
  • 服务效率提升实战:排队理论与多场景仿真案例
  • 安装开发环境
  • 深入解析Stable Diffusion核心组件:超越基础文本到图像的内部机制
  • 避免在 onbind 方法调用 getCallingUid 与 getCallingPid 方法
  • 好用的skills清单
  • 在 Android Studio 中,新建 AIDL 文件按钮是灰色
  • Android 开发问题:The direction of ‘data‘ is not specified. array can be an in, out, or inout parameter.
  • Android 多进程开发 - AIDL 回调、RemoteCallbackList、AIDL 安全校验
  • 为什么 Controller 层坚决不能直接调 DAO 层?
  • Redis 的 ZipList 是什么?它是怎么解决内存碎片问题的?