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

线性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] 范围内。

思路分析

  1. 问题类型
    数字三角形最大路径和问题,即在给定的三角形数字阵列中,找到从顶部到底部路径的最大累加值,路径每一步只能从当前点移动到下一行相邻点。
  2. 算法思路
    采用动态规划 方法:
    • 状态定义dp[i][j]表示从顶点(1,1)到点(i,j)的最大路径和。
    • 状态转移:每个点(i,j)只能由上方点(i-1,j)或左上方点(i-1,j-1)到达,取两者最大值加上当前点的值。
    • 初始化 :起点dp[1][1]初始化为三角形顶点的值。
    • 结果获取 :遍历最后一行的所有dp[r][i]值,取最大值作为答案。
  3. 时间复杂度
    • 数据读取:O(r²)
    • 动态规划过程:O(r²)
    • 最终结果扫描:O®
    • 总时间复杂度:O(r²),适用于r≤1000的规模。
  4. 空间复杂度
    • 使用二维数组存储数字三角形和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;
}
相关推荐
汉克老师43 分钟前
CCF-NOI2025第一试题目与解析(第二题、序列变换(sequence))
c++·算法·动态规划·noi
A charmer43 分钟前
内存泄漏、死锁:定位排查工具+解决方案(C/C++ 实战指南)
c语言·开发语言·c++
程序员东岸1 小时前
《数据结构——排序(下)》分治与超越:快排、归并与计数排序的终极对决
数据结构·c++·经验分享·笔记·学习·算法·排序算法
无限进步_1 小时前
C++初始化列表详解:语法、规则与最佳实践
java·开发语言·数据库·c++·git·github·visual studio
想唱rap1 小时前
C++之红黑树
开发语言·数据结构·c++·算法
无限进步_1 小时前
C++运算符重载完全指南:从基础到实战应用
开发语言·数据库·c++·windows·git·github·visual studio
feiyangqingyun1 小时前
Qt/C++地图最简示例/在线离线切换/地图视图切换/执行各种js函数交互
javascript·c++·qt
暗然而日章2 小时前
C++基础:Stanford CS106L学习笔记 4 容器(STL与序列容器)
c++·笔记·学习
系夏普2 小时前
重拾 C++:Ubuntu开发环境下的C++学习
c++