线性DP第12课:线性DP应用案例实践:数字三角形

题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

在上面的样例中,从 7 → 3 → 8 → 7 → 5 7 \to 3 \to 8 \to 7 \to 5 7→3→8→7→5 的路径产生了最大权值。
输入格式
第一个行一个正整数 r r r,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
输出格式
单独的一行,包含那个可能得到的最大的和。
输入输出样例 1
输入 1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出 1
30
说明/提示
对于 100 % 100\% 100% 的数据, 1 ≤ r ≤ 1000 1\le r \le 1000 1≤r≤1000,所有输入在 [ 0 , 100 ] [0,100] [0,100] 范围内。
思路分析
- 问题类型
数字三角形最大路径和问题,即在给定的三角形数字阵列中,找到从顶部到底部路径的最大累加值,路径每一步只能从当前点移动到下一行相邻点。 - 算法思路
采用动态规划 方法:- 状态定义 :
dp[i][j]表示从顶点(1,1)到点(i,j)的最大路径和。 - 状态转移:每个点(i,j)只能由上方点(i-1,j)或左上方点(i-1,j-1)到达,取两者最大值加上当前点的值。
- 初始化 :起点
dp[1][1]初始化为三角形顶点的值。 - 结果获取 :遍历最后一行的所有
dp[r][i]值,取最大值作为答案。
- 状态定义 :
- 时间复杂度
- 数据读取:O(r²)
- 动态规划过程:O(r²)
- 最终结果扫描:O®
- 总时间复杂度:O(r²),适用于r≤1000的规模。
- 空间复杂度
- 使用二维数组存储数字三角形和DP状态:O(2*r²) = O(r²)
代码实现
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1010; // 数组最大容量
int r,a[N][N]; // r:数字三角形行数,a:存储数字三角形
int dp[N][N]; // dp[i][j]表示从顶点(1,1)到点(i,j)的最大路径和
int main(){
cin>>r; // 输入行数
// 读取数字三角形数据
for(int i=1;i<=r;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
// 初始化动态规划起点
dp[1][1] = a[1][1]; // 顶点路径和为自身值
// 动态规划状态转移
for(int i=2;i<=r;i++){ // 从第二层开始计算
for(int j=1;j<=i;j++){ // 每层有i个元素
// 状态转移方程:当前位置可由左上方或正上方转移而来
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + a[i][j];
}
}
// 在最后一行寻找最大路径和
int ans=0;
for(int i=1;i<=r;i++){
ans = max(ans, dp[r][i]);
}
cout<<ans;
return 0;
}
注释说明
-
核心状态转移 :
dp[i][j] = max(上方节点, 左上方节点) + 当前节点值,这确保了每一步都选择局部最优解。 -
边界处理 :当j=1时,
dp[i-1][j-1]会访问dp[i-1][0],但由于数组未初始化该区域,实际代码中通过循环设计避免了越界问题(因为j从1开始)。
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
- 一、CSP信奥赛C++通关学习视频课:
- C++语法基础
- C++语法进阶
- C++算法
- C++数据结构
- CSP信奥赛数学
- CSP信奥赛STL
- 二、CSP信奥赛C++竞赛拿奖视频课:
- 信奥赛csp-j初赛高频考点解析
- CSP信奥赛C++复赛集训课(12大高频考点专题集训)
- 三、考级、竞赛刷题题单及题解:
- GESP C++考级真题题解
- CSP信奥赛C++初赛及复赛高频考点真题解析
- CSP信奥赛C++一等奖通关刷题题单及题解
详细内容:
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转



2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

3、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
- 2025 csp-j 复赛真题及答案解析(最新更新)
- 2025 csp-x(山东) 复赛真题及答案解析(最新更新)
- 2025 csp-x(河南) 复赛真题及答案解析(最新更新)
- 2025 csp-x(辽宁) 复赛真题及答案解析(最新更新)
- 2025 csp-x(江西) 复赛真题及答案解析(最新更新)
- 2025 csp-x(广西) 复赛真题及答案解析(最新更新)
- 2020 ~ 2024 csp 复赛真题题单及题解
- 2019 ~ 2022 csp-j 初赛高频考点真题分类解析
- 2021 ~ 2024 csp-s 初赛高频考点解析
- 2023 ~ 2024 csp-x (山东)初赛真题及答案解析
- 2024 csp-j 初赛真题及答案解析
- 2025 csp-j 初赛真题及答案解析(最新更新)
- 2025 csp-s 初赛真题及答案解析(最新更新)
- 2025 csp-x (山东)初赛真题及答案解析(最新更新)
- 2025 csp-x (江西)初赛真题及答案解析(最新更新)
- 2025 csp-x (辽宁)初赛真题及答案解析(最新更新)
CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
- 129 道刷题练习和详细题解,涉及:模拟算法、数学思维、二分算法、 前缀和、差分、深搜、广搜、DP专题、 树和图
4、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}