新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++之线性DP

发布时间:2026/9/30 5:22:16来源:尧图网络
C++之线性DP
引言线性dp用来解决线性一维最大/最小问题可以降低时间复杂度先看题描述八戒押 x 两银子猫掌柜给定一个乱序数组 arr长度为 N有正数也有负数正数表示赢钱负数表示输钱。求 arr 的一个连续子数组使得子数组的和最大这样八戒才能尽可能的赢钱。这个和最大的子数组叫做最大子段和。输入描述第一行有两个数字分别是 x 和 N用空格隔开。第二行有 N 个数字用空格隔开表示数组元素。输出描述输出八戒最多赢多少钱若八戒想即时止损则输出一个负数表示八戒最少输多少钱。样例输入 112 8 1 -2 3 10 -4 7 2 -5样例输出 16提示1≤x,N≤100000最大子数组为[3 10 -4 7 2]和为18八戒押了12两银子所以最后赢6两分析这道题如果没学过线性dp第一眼看上去会很茫然。其实这是一道经典问题——最大子段和。那么问题来了总不能把所有子段枚举一遍吧聪明的你想到了这种方法dp[1] arr[1]; for (int i 1; i n; i) { if (dp[i - 1] 0) { dp[i] arr[i]; } else { dp[i] arr[i] dp[i - 1]; } max_s max(max_s, dp[i]); } cout max_s;恭喜你发明了最大子段和算法。再看一道题描述一个数的序列 bi​当 b1​b2​...bS​ 的时候我们称这个序列是上升的。对于给定的一个序列 (a1​,a2​,...,aN​)我们可以得到一些上升的子序列 (ai1​​, ai2​​, …, aiK​​)这里 1≤i1​i2​...iK​≤N。比如对于序列(1,7,3,5,9,4,8)有它的一些上升子序列如(1,7),(3,4,8)等等。这些子序列中和最大为 18为子序列(1,3,5,9)的和。你的任务就是对于给定的序列求出最大上升子序列和。注意最长的上升子序列的和不一定是最大的比如序列 (100,1,2,3) 的最大上升子序列和为 100而最长上升子序列为 (1,2,3)。输入描述输入的第一行是序列的长度 N(1≤N≤1000)。第二行给出序列中的 N 个整数这些整数的取值范围都在 0 到 10000(可能重复)。输出描述最大上升子序列和。样例输入 17 111111 7 3 5 9 4 11111样例输出 1111111提示1≤N≤1000分析这题和上一题差不多都求最大和这里就直接上代码了#include bits/stdc.h using namespace std; int n, dp[1009], a[1009], ans; int main() { cin n; for (int i 1; i n; i) { cin a[i]; dp[i] a[i]; } for (int i 2; i n; i) { for (int j 1; j i; j) { if (a[i] a[j]) { dp[i] max(dp[i], a[i] dp[j]); } } } for (int i 1; i n; i) { ans max(ans, dp[i]); } cout ans; return 0; }再来一道题描述一个数的序列 bi​当 b1​b2​...bS​ 的时候我们称这个序列是上升的。对于给定的一个序列 (a1​,a2​,...,aN​)我们可以得到一些上升的子序列(ai1​,ai2​,...,aiK​)这里1≤i1​,1≤i2​,...,1≤ik​≤N.比如对于序列 (1,7,3,5,9,4,8)有它的一些上升子序列如(1,7),(3,4,8)等等。这些子序列中最长的长度是4比如子序列(1,3,5,8)。你的任务就是对于给定的序列求出最长上升子序列的长度。输入描述输入的第一行是序列的长度 N(1≤N≤1000)。第二行给出序列中的 N 个整数这些整数的取值范围都在 0 到 10000。输出描述最长上升子序列的长度。样例输入 17 1 7 3 5 9 4 8样例输出 14分析这题和上一题的唯一区别就在于求长度or和稍微改一下代码就行了第八行初始化改为dp[i] 1;第13行改为dp[i] max(dp[i], dp[j] 1);小结线性dp往往是解决实际问题的基础学好线性dp竞赛中才能尽可能少出现TLE的问题
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

任少卿时隔十年再出手:MM-Future让自动驾驶“走一步想十步” 2026/9/30 7:23:06

任少卿时隔十年再出手:MM-Future让自动驾驶“走一步想十步”

「多模式联合世界‑动作模型」 目录 01 自动驾驶世界‑动作模型现存两难矛盾 1.1 三类主流WAM范式的固有短板 02 MM‑Future完整技术链路 2.1 面向规划的MM‑Tokens压缩表征 2.2 多模式联合世界‑动作条件流生成 2.3 未来条件提案打分器 03 NAVSIM、HUGSIM仿真…

阅读更多 →
30-seconds-of-code:CSS 逻辑属性与物理属性对照指南(Logical  Physical Properties) 2026/9/30 7:23:06

30-seconds-of-code:CSS 逻辑属性与物理属性对照指南(Logical Physical Properties)

教程文档 【免费下载链接】30-seconds-of-code Coding articles to level up your development skills 项目地址: https://gitcode.com/gh_mirrors/30/30-seconds-of-code 点击查看 免费下载 导读 CSS 逻辑属性(Logical Properties)让开发者…

阅读更多 →
公司发展到一定阶段,到底要不要封装中间件? 2026/9/30 7:22:59

公司发展到一定阶段,到底要不要封装中间件?

这个问题其实困扰过很多技术团队,尤其是那些从一条业务线慢慢长成多条业务线的公司。我们自己也走过这条路,从"啥都自己包"到"出了事故赶紧拆",算是把封装中间件这件事从头到尾经历了一遍。今天就把这些经历和思考整理一…

阅读更多 →
【数据科学】【会计学】第十五篇 财务管理中的成本会计领域101 2026/9/30 7:22:46

【数据科学】【会计学】第十五篇 财务管理中的成本会计领域101

一、总表( 编号 类型 行业【国民经济行业分类】+细分 财务会计领域 成本性形态 业务-财务-会计融合函数/算法/规则(逐步推理) 参数列表及数学特征、数据结构 法律法规/监管/党纪及裁决方法 关联知识 C01 直接材料成本 制造业-通用/专用设备、汽车、电子;细分:钣…

阅读更多 →
财务人记住:别替领导扛责任,善良要有锋芒 2026/9/30 7:22:46

财务人记住:别替领导扛责任,善良要有锋芒

财务人最容易吃亏的地方,往往不是不会做事,而是太愿意把事情做完。业务数据没交,自己补;领导没有明确表态,先按经验处理;项目出了问题,也习惯第一时间帮忙兜住。事情顺利时,大家觉得…

阅读更多 →
Linux 学习笔记(八)C语言——函数进阶与编程核心知识:递归、数组传参、作用域、存储类别与宏定义 2026/9/30 7:22:32

Linux 学习笔记(八)C语言——函数进阶与编程核心知识:递归、数组传参、作用域、存储类别与宏定义

一、函数回顾与递归1.1 函数的核心思想函数的核心思想是自上而下,逐步拆解:将大问题拆成小问题小问题拆成更小问题更小的问题往往对应一个简单、独立的功能函数模型:输入 — 处理 — 输出1.2 递归的概念递归:函数自己调用自己。直…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉