线性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;
}
相关推荐
wuyk55531 分钟前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无1 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率1152001 小时前
C++新特性---属性说明符与标准属性
开发语言·c++
不会代码的小猴1 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
evans在进步6 小时前
LeetCode 322:零钱兑换——Java 动态规划详解
java·leetcode·动态规划
烧酒同学6 小时前
【C++】记录size of std::vector的巧妙坑
开发语言·c++·图形渲染
@呱呱爱学习8 小时前
C++大成之路_ STL容器_ Vector
开发语言·c++
码匠许师傅9 小时前
【C++ 面试真题】19. 聊聊 C++ 的迭代器
开发语言·c++·面试
qeen879 小时前
【数据结构】红黑树的算法原理解析与实现
开发语言·数据结构·c++·算法·红黑树
码匠许师傅9 小时前
【C++ 面试真题】20. 聊聊 C++ 的标准库常用算法
c++·算法·面试