于动态规划的启幕之章,借 C++ 笔触绘就算法新篇

注意:代码由易到难
P1216 [IOI 1994] 数字三角形 Number Triangles
题目链接:[IOI 1994] 数字三角形 Number Triangles - 洛谷
题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
在上面的样例中,从 7→3→8→7→57→3→8→7→5 的路径产生了最大权值。
输入格式
第一个行一个正整数 �r ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
输出格式
单独的一行,包含那个可能得到的最大的和。
输入输出样例
输入 #1
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5输出 #1
30说明/提示
【数据范围】
对于 100%100% 的数据,1≤r≤1000,所有输入在 [0,100] 范围内。思路:动态规划,由局部最优达到全局最优
本题属于动态规划中最优子问题类
代码一(dfs+记忆化数组) 注意:本代码有一个测试点超时

#include<iostream> // 包含标准输入输出流库
#include<algorithm> // 包含算法库,用于使用 max 函数
using namespace std;int r; // 全局变量,表示三角形的行数
int arr[1001][1001]; // 用于存储数字三角形的数组,大小为 1001x1001
int memory[1001][1001] = {0}; // 用于记忆化搜索的数组,初始化为 0// 深度优先搜索(DFS)函数,用于计算从 (x, y) 到三角形底部的最大路径和
int dfs(int x, int y) {if (memory[x][y] != 0) return memory[x][y]; // 如果已经计算过 (x, y) 的结果,直接返回int mid;if (x > r || y > x) { // 如果超出三角形范围mid = 0; // 返回 0} else {// 递归计算从 (x, y) 向下和向右下两个方向的最大路径和,并加上当前节点的值mid = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + arr[x][y];}memory[x][y] = mid; // 将结果存储到记忆化数组中return mid; // 返回当前节点的最大路径和
}// 主逻辑函数,读取输入并调用 DFS
void solution() {cin >> r; // 输入三角形的行数for (int i = 1; i <= r; i++) { // 逐行读取三角形的每一行for (int j = 1; j <= i; j++) { // 逐个读取当前行的每个数字cin >> arr[i][j]; // 存储到 arr 数组中}}int maxSum = dfs(1, 1); // 从三角形顶部 (1, 1) 开始计算最大路径和cout << maxSum << endl; // 输出最大路径和
}int main() {ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率cin.tie(nullptr); // 解绑 cin 和 cout,进一步提高效率int T = 1; // 测试用例数量,默认为 1// cin >> T; // 如果需要多个测试用例,可以取消注释while (T--) { // 对每个测试用例调用 solution 函数solution();}return 0; // 程序结束
}
代码二(动态规划,通过)

#include<iostream>
#include<algorithm>
using namespace std;int r; // 三角形的行数
int arr[1002][1002]; // 存储输入的数字三角形
int mid[1002][1002] = {0}; // 动态规划数组,用于存储从底部到当前点的最大路径和// 解决数字三角形问题的函数
void solution()
{cin >> r; // 输入三角形的行数for (int i = 1; i <= r; i++) // 逐行读取三角形的数据{for (int j = 1; j <= i; j++) // 每行的列数等于行号{cin >> arr[i][j]; // 输入当前元素}}// 动态规划从三角形的底部向上计算最大路径和for (int i = r; i >= 1; i--) // 从最后一行开始向上遍历{for (int j = 1; j <= i; j++) // 遍历当前行的每个元素{// 当前点的最大路径和等于当前点的值加上其下方两个点中较大的值mid[i][j] = max(mid[i + 1][j], mid[i + 1][j + 1]) + arr[i][j];}}cout << mid[1][1] << endl; // 输出从顶部到底部的最大路径和
}int main()
{ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率cin.tie(nullptr); // 解绑cin和cout,进一步提高效率int T = 1; // 测试用例数量(这里固定为1)// cin >> T; // 如果需要处理多组数据,可以取消注释while (T--) // 处理每一组数据{solution(); // 调用solution函数解决问题} return 0; // 程序结束
}
代码三(动态规划+滚动数组)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
#define av(y) setprecision(y)<<fixed;int r; // 三角形的行数
int arr[1002][1002]; // 存储输入的数字三角形
int mid[1002] = {0}; // 动态规划数组,用于存储从底部到当前点的最大路径和(一维数组)// 解决数字三角形问题的函数
void solution()
{cin >> r; // 输入三角形的行数for (int i = 1; i <= r; i++) // 逐行读取三角形的数据{for (int j = 1; j <= i; j++) // 每行的列数等于行号{cin >> arr[i][j]; // 输入当前元素}}// 动态规划从三角形的底部向上计算最大路径和for (int i = r; i >= 1; i--) // 从最后一行开始向上遍历{for (int j = 1; j <= i; j++) // 遍历当前行的每个元素{// 当前点的最大路径和等于当前点的值加上其下方两个点中较大的值// 这里使用一维数组 mid 来存储中间结果mid[j] = max(mid[j], mid[j + 1]) + arr[i][j];}}cout << mid[1] << endl; // 输出从顶部到底部的最大路径和
}int main()
{ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率cin.tie(nullptr); // 解绑cin和cout,进一步提高效率int T = 1; // 测试用例数量(这里固定为1)// cin >> T; // 如果需要处理多组数据,可以取消注释while (T--) // 处理每一组数据{solution(); // 调用solution函数解决问题} return 0; // 程序结束
}
01背包问题
此视频可帮助理解01背包问题:
【自制】01背包问题算法动画讲解_哔哩哔哩_bilibili
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。输入格式
第一行两个整数N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
0<vi,wi≤1000输入样例
4 5 1 2 2 4 3 4 4 5输出样例:
8
思路:就是每次打算放一个东西时,首先要考虑它放不放得下,放不下的话就直接不放;放得下的话,就要看放他划算还是不放它划算
枚举模拟算法+相对位置
代码一(dfs+记忆化搜索)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
using namespace std;
#define av(y) setprecision(y)<<fixed;const int N = 1010; // 定义最大物品数量和背包容量int n, m; // 物品数量和背包容量
int v[N], w[N]; // 物品的体积和价值
int mem[N][N] = {0}; // 记忆化数组,存储已计算的状态// 深度优先搜索 + 记忆化搜索
int dfs(int x, int spV)
{// 如果当前状态已经计算过,直接返回结果if (mem[x][spV]) return mem[x][spV];int sum = 0;// 如果已经考虑完所有物品,返回0if (x < 1){return 0;}// 如果当前背包容量不足以放下第x个物品,只能选择不放if (spV < v[x]) {sum = dfs(x - 1, spV); // 不放当前物品,继续考虑前一个物品}else {// 如果背包容量足够,选择放或不放第x个物品,取两者中的最大值sum = max(dfs(x - 1, spV), dfs(x - 1, spV - v[x]) + w[x]);}// 将当前状态的最优解存储到记忆化数组中mem[x][spV] = sum;return sum;
}void solution()
{cin >> n >> m; // 输入物品数量和背包容量for (int i = 1; i <= n; i++){cin >> v[i] >> w[i]; // 输入每个物品的体积和价值}int res = dfs(n, m); // 从最后一个物品开始,背包容量为mcout << res << endl; // 输出结果
}int main()
{ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率cin.tie(nullptr); // 解绑cin和cout,进一步提高效率int T = 1; // 测试用例数量(这里固定为1)// cin >> T; // 如果需要处理多组数据,可以取消注释while (T--){solution(); // 调用solution函数解决问题} return 0; // 程序结束
}
下面的与上面的代码并无本质区别
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
using namespace std;
#define av(y) setprecision(y)<<fixed;const int N = 1010;int n, m;
int v[N], w[N];
int mem[N][N];// 深度优先搜索 + 记忆化搜索
int dfs(int x, int spV)
{if (x > n) return 0; // 超过物品数量,返回0if (mem[x][spV] != -1) return mem[x][spV]; // 如果已经计算过,直接返回记忆化的结果int sum = 0;if (spV < v[x]) // 如果当前背包容量不足以放下第x个物品sum = dfs(x + 1, spV); // 不放第x个物品else // 否则,选择放或不放第x个物品,取最大值sum = max(dfs(x + 1, spV), dfs(x + 1, spV - v[x]) + w[x]);mem[x][spV] = sum; // 记忆化结果return sum;
}void solution()
{cin >> n >> m; // 输入物品数量和背包容量for (int i = 1; i <= n; i++){cin >> v[i] >> w[i]; // 输入每个物品的体积和价值}memset(mem, -1, sizeof(mem)); // 初始化记忆化数组为-1int res = dfs(1, m); // 从第1个物品开始,背包容量为mcout << res << endl; // 输出结果
}int main()
{ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率cin.tie(nullptr); // 解绑cin和cout,进一步提高效率int T = 1; // 测试用例数量(这里固定为1)// cin >> T; // 如果需要处理多组数据,可以取消注释while (T--) // 处理每一组数据{solution(); // 调用solution函数解决问题} return 0; // 程序结束
}
相关文章:
于动态规划的启幕之章,借 C++ 笔触绘就算法新篇
注意:代码由易到难 P1216 [IOI 1994] 数字三角形 Number Triangles 题目链接:[IOI 1994] 数字三角形 Number Triangles - 洛谷 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每…...
基于开源2 + 1链动模式AI智能名片S2B2C商城小程序的内容创作与传播效能探究
摘要:本文围绕开源2 1链动模式AI智能名片S2B2C商城小程序,深入探讨在其应用场景下内容创作与传播效果的关键要素——转发数与转化率。通过剖析如何创作引发用户共鸣、提升用户信任的内容,阐明深度思考内容本质对于实现有效传播的重要性&…...
Web - CSS3基础语法与盒模型
概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性,如段落和行相关属性、字体文本属性。最后阐述了盒子模型,如元素隐藏、行内与块元素转换、…...
自然语言处理-词嵌入 (Word Embeddings)
人工智能例子汇总:AI常见的算法和例子-CSDN博客 词嵌入(Word Embedding)是一种将单词或短语映射到高维向量空间的技术,使其能够以数学方式表示单词之间的关系。词嵌入能够捕捉语义信息,使得相似的词在向量空间中具有…...
深度学习之“线性代数”
线性代数在深度学习中是解决多维数学对象计算问题的核心工具。这些数学对象包括标量、向量、矩阵和张量,借助它们可以高效地对数据进行操作和建模。以下将详细介绍这些数学对象及其在深度学习中的典型用途。 数学对象概述 标量 标量是最简单的数学对象࿰…...
SpringBoot的配置(配置文件、加载顺序、配置原理)
文章目录 SpringBoot的配置(配置文件、加载顺序、配置原理)一、引言二、配置文件1、配置文件的类型1.1、配置文件的使用 2、多环境配置 三、加载顺序四、配置原理五、使用示例1、配置文件2、配置类3、控制器 六、总结 SpringBoot的配置(配置文件、加载顺序、配置原理) 一、引言…...
【C++语言】卡码网语言基础课系列----13. 链表的基础操作I
文章目录 背景知识链表1、虚拟头节点(dummyNode)2、定义链表节点3、链表的插入 练习题目链表的基础操作I具体代码实现 小白寄语诗词共勉 背景知识 链表 与数组不同,链表的元素存储可以是连续的,也可以是不连续的,每个数据除了存储本身的信息…...
python小知识-jupyter lab
python小知识-jupyter lab 1. Jupyter Lab功能介绍 Jupyter Lab 是一个基于网页的交互式开发环境,它支持 Jupyter Notebook、文本编辑器、终端、数据可视化以及其他自定义组件。它提供了一个灵活的用户界面,允许用户创建和共享包含实时代码、方程、可视…...
数组—学习
1.基础知识 1. 高精度计算 高精度算法是处理大数(超过64位)的计算方法。C标准库没有直接支持大数运算,因此需要使用数组来模拟大数的存储和运算。 2. 全局静态数组 全局变量(包括静态数组)在C中会在程序启动时自动初…...
解决国内服务器 npm install 卡住的问题
在使用国内云服务器时,经常会遇到 npm install 命令执行卡住的情况。本文将分享一个典型案例以及常见的解决方案。 问题描述 在执行以下命令时: mkdir test-npm cd test-npm npm init -y npm install lodash --verbose安装过程会卡在这个状态…...
CVE-2023-38831 漏洞复现:win10 压缩包挂马攻击剖析
目录 前言 漏洞介绍 漏洞原理 产生条件 影响范围 防御措施 复现步骤 环境准备 具体操作 前言 在网络安全这片没有硝烟的战场上,新型漏洞如同隐匿的暗箭,时刻威胁着我们的数字生活。其中,CVE - 2023 - 38831 这个关联 Win10 压缩包挂…...
流媒体娱乐服务平台在AWS上使用Presto作为大数据的交互式查询引擎的具体流程和代码
一家流媒体娱乐服务平台拥有庞大的用户群体和海量的数据。为了高效处理和分析这些数据,它选择了Presto作为其在AWS EMR上的大数据查询引擎。在AWS EMR上使用Presto取得了显著的成果和收获。这些成果不仅提升了数据查询效率,降低了运维成本,还…...
Clion开发STM32时使用stlink下载程序与Debug调试
一、下载程序 先创建一个文件夹: 命名:stlink.cfg 写入以下代码: # choose st-link/j-link/dap-link etc. #adapter driver cmsis-dap #transport select swdsource [find interface/stlink.cfg]transport select hla_swdsource [find target/stm32f4x.…...
无人机图传模块 wfb-ng openipc-fpv,4G
openipc 的定位是为各种模块提供底层的驱动和linux最小系统,openipc 是采用buildroot系统编译而成,因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢?因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来,从而…...
C语言 --- 分支
C语言 --- 分支 语句分支语句含义if...else语句单分支if语句语法形式 双分支 if-else 语句语法形式 悬空else含义问题描述 多分支 if-else 语句语法形式 switch...case语句含义语法形式 总结 💻作者简介:曾与你一样迷茫,现以经验助你入门 C 语…...
面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述
文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例:结构体的内存对齐分析: 内存对齐的常见规则:填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...
低代码系统-产品架构案例介绍、炎黄盈动-易鲸云(十二)
易鲸云作为炎黄盈动新推出的产品,在定位上为低零代码产品。 开发层 表单引擎 表单设计器,包括设计和渲染 流程引擎 流程设计,包括设计和渲染,需要说明的是:采用国际标准BPMN2.0,可以全球通用 视图引擎 视图…...
自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)
开源地址:VMwork 要使终端不弹出, #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…...
[c语言日寄]C语言类型转换规则详解
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
Rust 的基本类型有哪些,他们存在堆上还是栈上,是否可以COPY?
Rust 的基本类型主要包括以下几类: 1. 整数类型(Integer) Rust 提供了有符号和无符号的整数类型: 有符号整数(i8, i16, i32, i64, i128, isize)无符号整数(u8, u16, u32, u64, u128, usize&a…...
oracle 19C RAC打补丁到19.26
oracle 19CRAC打补丁到19.26 本文只保留简介命令和每个命令大概的用时,方便大家直接copy使用,并了解每个命令的预期时间,减少命令执行期的等待焦虑。 1.本次所需的补丁如下 p6880880_190000_Linux-x86-64.zip (.43的opatch&…...
利用Spring Batch简化企业级批处理应用开发
1. 引言 1.1 批处理的重要性 在现代企业系统中,批处理任务用于处理大量数据,如报表生成、数据迁移、日终结算等。这些任务通常不需要实时响应,但需要高效、可靠地完成。批处理可以显著提高系统性能,减少实时系统的负载,并确保数据的完整性和一致性。 1.2 Spring Batch简…...
三、js笔记
(一)JavaScript概述 1、发展历史 ScriptEase.(客户端执行的语言):1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)Javascript:Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigat…...
C# 语言基础全面解析
.NET学习资料 .NET学习资料 .NET学习资料 一、引言 C# 是一种功能强大、面向对象且类型安全的编程语言,由微软开发,广泛应用于各种类型的软件开发,从桌面应用、Web 应用到游戏开发等领域。本文将全面介绍 C# 语言的基础知识,帮…...
基于SpringBoot的青年公寓服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Bash 基础与进阶实践指南
目录 Bash 简介与基础基本命令与文件操作权限管理与用户管理重定向与管道变量与环境变量通配符与正则表达式Shell 脚本结构与控制流常用内建命令与技巧文本处理常用命令作业控制与进程管理别名与函数实用技巧与注意事项更多 Bash 进阶话题参考资源 1. Bash 简介与基础 1.1 什…...
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据 一、服务器如何响应前端请求 前端与后端的交互主要通过 HTTP 协议实现。以下是详细步骤: 1. 前端发起 HTTP 请求 GET 请求:用于从服务器获取数据。POST 请求:用…...
使用LLaMA-Factory对AI进行认知的微调
使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…...
Kafka分区策略实现
引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中,合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略(默认) 轮询策略是 Kafka 默认的分区策略(当消息没有指定键时&…...
在无sudo权限Linux上安装 Ollama 并使用 DeepSeek-R1 模型
本教程将指导你如何在 Linux 系统上安装 Ollama(一个本地运行大型语言模型的工具),并加载 DeepSeek-R1 模型。DeepSeek-R1 是一个高性能的开源语言模型,适用于多种自然语言处理任务。 DeepSeek-R1 简介 DeepSeek-R1 是 DeepSeek …...


