暑假日训【动态规划】
这是真的一开始有点难啊。题看的我不知道怎么用动态规划最有用的学习方法应该是找视频看动画化的才形象吧。最重要偶的还是要学会递推学会反推我觉得动规五部曲很有用啊摘抄自代码随想录确定dp数组dp table以及下标的含义确定递推公式dp的初始化确定遍历顺序如dp[i] 是依靠 dp[i - j]的状态所以遍历i一定是从前向后遍历先有dp[i - j]再有dp[i]举例推导dp数组这样一步一步就可以自己独立解决问题了ok来一题我来分析分析96. 不同的二叉搜索树1.下标含义是第i个结点dp[i]是1到i个结点的种数2.dp[i] dp[j - 1] * dp[i - j]; 哈哈其实这步我一开始写错了。3.dp[0]14.遍历i里面每一个数作为头结点的状态用j来遍历。class Solution { public: int numTrees(int n) { vectorintdp(n1); dp[0]1; for(int i1;in;i) { for(int j1;ji;j) { dp[i]dp[j-1]*dp[i-j]; } } return dp[n]; } };感觉背包就是把一维变二维找清楚什么是物品什么是背包一定要自己手写模拟一遍写了不少基础题。终于有题是完全自己想出来的了。多重背包一、定义01 背包每种物品最多选 1 件完全背包每种物品可以选无限件多重背包每种物品有最多 si​ 件可以选每件体积 vi​价值 wi​背包总容量 V求最大价值状态定义一维标准写法dp[j] 背包容量为 j 时能装的最大价值二、朴素做法暴力拆分不推荐大数据思路把第 i 种有 si​ 件的物品拆成 si​ 个独立物品直接跑 01 背包56. 携带矿石资源第八期模拟笔试五步法① 确定 dp 数组以及下标的含义dp[j]背包容量为j时能够装入矿石的最大总价值一维滚动数组写法压缩二维 dp只用一维数组保存背包不同容量下的最优解。② 确定递推公式对于第 i 种矿石我们可以取 k 件1≤k≤nums[i]且 k⋅weight[i]≤j不取这件矿石dp[j]保持原值取 k 件这件矿石dp[j - k * weight[i]] k * value[i]dp[j]max(dp[j], dp[j−k⋅w[i]]k⋅v[i])③ dp 数组如何初始化vectorint dp(bagweight1, 0);初始所有dp[j]0含义背包容量为 j还没有装入任何矿石时总价值一定是 0。没有负价值物品不需要初始化为负无穷。④ 确定遍历顺序三层循环顺序第一层 i遍历每一种矿石物品第二层 j背包容量从后往前遍历bagweight → weight [i]和 01 背包一样一维滚动数组逆序遍历防止同一物品被多次重复选取第三层 k枚举当前矿石取多少件1 ~ nums [i]关键点一维dp[j]是上层上一种物品的旧状态j 逆序才能保证更新dp[j]时dp[j - k*w[i]]没有被本次物品提前更新避免重复选。⑤ 举例推导 dp 数组暂省略#includebits/stdc.h using namespace std; int main() { int bagweight,n; cinbagweightn; vectorintweight(n,0); vectorintvalue(n,0); vectorintnums(n,0); for(int i0;in;i)cinweight[i]; for(int i0;in;i)cinvalue[i]; for(int i0;in;i)cinnums[i];//以上是输入 vectorintdp(bagweight1,0); for(int i0;in;i)//遍历物品遍历每一种矿石 { for(int jbagweight;jweight[i];j--)//遍历背包容量 { for(int k1;knums[i](j-k*weight[i])0;k)//枚举当前物品选多少个分离 / 拆分物品数量 { dp[j]max(dp[j],dp[j-k*weight[i]]k*value[i]); } } } coutdp[bagweight]endl; return 0; }目前我觉得的最关键的还是递推公式的确定得自己画表格推出来才行不然不知道上下两个数据的潜在关系是什么啊P1020 [NOIP 1999 提高组] 导弹拦截这道题有两个问题 问题 1一套系统最多拦截导弹数量 最长不上升子序列LNDS长度问题 2最少需要几套系统 最长上升子序列LIS长度Dilworth 定理Dilworth 定理偏序集最少的反链划分数 最长链长度翻译把序列拆成最少个不上升子序列等价于求原序列最长上升子序列长度问题一1. 确定 dp 数组以及下标的含义dp[i]以第i枚导弹结尾的最长不上升子序列的长度2. 确定递推公式遍历前面所有 ji如果 h[j]≥h[i]可以接在 j 后面满足不上升dp[i]max(dp[i],dp[j]1)初始默认dp[i] 1只选自己这一个导弹3. dp 数组如何初始化所有dp[i] 1含义每一枚导弹自身就是长度为 1 的子序列4. 确定遍历顺序两层循环外层 i从前往后遍历每一枚导弹作为子序列结尾内层 j遍历 i 前面所有导弹 0≤ji要用到前面 j 的 dp [j]所以 i 从小到大正序遍历5. 举例推导 dp 数组样例输入问题21. 确定 dp 数组以及下标的含义f[i]以第i枚导弹结尾的最长上升子序列长度2. 确定递推公式遍历前面所有 ji如果 h[j]h[i]f[i]max(f[i],f[j]1)初始f[i]13. dp 数组如何初始化所有f[i] 14. 确定遍历顺序外层 i 从小到大内层 j i 正序遍历5. 举例推导 dp 数组样例以下是部分AC部分超时的代码版本时间复杂度O (n²)#includebits/stdc.h using namespace std; int main() { vectorint h; int x; // 读入所有导弹高度 while(cin x) { h.push_back(x); } int n h.size(); vectorint dp(n,1); // 最长不上升子序列 vectorint f(n,1); // 最长上升子序列 for(int i0;in;i) { for(int j0;ji;j) { // 第一问不上升 h[j] h[i] if(h[j] h[i]) { dp[i] max(dp[i], dp[j]1); } // 第二问上升 h[j] h[i] if(h[j] h[i]) { f[i] max(f[i], f[j]1); } } } int ans1 0, ans2 0; for(int i0;in;i) { ans1 max(ans1, dp[i]); ans2 max(ans2, f[i]); } cout ans1 endl; cout ans2 endl; return 0; }全部ac贪心二分问了ai辅助理解代码好简短清晰的代码-_-我还做不到这种#includebits/stdc.h using namespace std; int main() { vectorint h; // 存储所有导弹的高度 int x; // 循环读取输入的导弹高度直到输入结束适配一行不定长输入 while(cin x) h.push_back(x); vectorint down; // 贪心数组维护最长【不上升】子序列down.size()就是第一问答案 vectorint up; // 贪心数组维护最长【上升】子序列up.size()就是第二问答案Dilworth定理 // 逐个遍历每一枚导弹的高度 for(auto num : h) { // 求最长不上升子序列第一问一套系统最多拦截导弹数 // upper_bound 在【降序】区间查找第一个 num 的元素迭代器greaterint()代表数组是降序 auto it upper_bound(down.begin(), down.end(), num, greaterint()); if(it down.end()) { // down中所有元素都 num可以接在末尾子序列长度1 down.push_back(num); } else { // 贪心替换把第一个小于num的元素换成num让后续更容易接上更多导弹 *it num; } // 求最长上升子序列第二问最少需要几套拦截系统 // lower_bound 在【升序】区间查找第一个 num 的元素迭代器默认升序无需额外比较函数 auto it2 lower_bound(up.begin(), up.end(), num); if(it2 up.end()) { // up中所有元素都 num可以接在末尾子序列长度1 up.push_back(num); } else { // 贪心替换把第一个大于等于num的元素换成num让后续更容易接更大数字 *it2 num; } } // down.size()最长不上升子序列长度up.size()最长上升子序列长度 cout down.size() \n up.size() endl; return 0; }upper_bound( 起始迭代器, 结束迭代器, 值, [比较函数] )作用在有序区间里二分查找返回迭代器默认升序不带比较器找到第一个 val的元素位置传入greaterint()区间降序找到第一个 val的元素位置down.end()不是最后一个元素是容器末尾后一个空位迭代器代表查找失败区间里没有符合条件的元素判断含义没有找到第一个 num 的元素down 内全部元素 ≥ num可以追加到数组尾部lower_bound(起始迭代器, 结束迭代器, 值, [可选比较函数])默认不传比较器要求区间升序排列功能二分查找返回第一个 ≥ val的元素迭代器P1091 [NOIP 2004 提高组] 合唱队形依旧是两个dp数组分开分析一、left 数组left [i]以 i 结尾左侧最长严格上升子序列dp 数组含义left[i]第 i 位同学作为子序列末尾从左边到 i 的最长严格上升子序列长度递推公式遍历 ji如果 h[j]h[i]left[i]max(left[i],left[j]1)初始化所有left[i] 1自身单独构成长度为 1 的子序列遍历顺序i 从左向右 0~n-1j 在每轮 i 中遍历 0~i-1从小到大举例推导样例二、right 数组right [i]以 i 为起点向右最长严格下降子序列dp 数组含义right[i]第 i 位同学作为峰顶向右延伸的最长严格下降子序列长度等价从右往左求以 i 结尾最长严格上升递推公式遍历 ji如果 h[j]h[i]right[i]max(right[i],right[j]1)初始化所有right[i]1遍历顺序i 从右向左 n-1 downto 0j 遍历 i1 ~ n-1举例推导样例#includebits/stdc.h using namespace std; int main() { int n; cin n; vectorint h(n); // 读取身高数组 for(int i 0; i n; i) { cin h[i]; } vectorint left(n, 1); // left[i]: 以i结尾左侧最长严格上升子序列 vectorint right(n, 1); // right[i]: 以i开头右侧最长严格下降子序列 // 计算left数组从左往右遍历 for(int i 0; i n; i) { for(int j 0; j i; j) { if(h[j] h[i]) // 严格上升 { left[i] max(left[i], left[j] 1); } } } // 计算right数组从右往左遍历 for(int i n - 1; i 0; i--) { for(int j i 1; j n; j) { if(h[j] h[i]) // i后面的比i矮严格下降 { right[i] max(right[i], right[j] 1); } } } // 枚举每个点作为山顶求最长合唱队形长度 int max_len 0; for(int i 0; i n; i) { max_len max(max_len, left[i] right[i] - 1); } // 总人数 - 最长保留人数 需要出列人数 cout n - max_len endl; return 0; }未完待续。

相关新闻

AI代理数据探索节制框架:如何防止智能查询引发数据库雪崩

AI代理数据探索节制框架:如何防止智能查询引发数据库雪崩

1. 项目缘起:当AI代理开始“自由探索”关系型数据系统最近在做一个企业级数据平台的架构升级项目,遇到了一个挺有意思的挑战。我们引入了一个基于大语言模型的智能数据探索代理(Agent),它的核心任务,是让业…

2026/8/23 9:16:48 阅读更多 →
Engrampa:MATE桌面下被低估的归档管理器,提升开发效率的图形化利器

Engrampa:MATE桌面下被低估的归档管理器,提升开发效率的图形化利器

如果你在 Linux 桌面环境中工作,尤其是使用 MATE 这样的经典桌面,那么“归档管理器”这个看似不起眼的小工具,很可能就是你日常效率链条上最薄弱的一环。你是否经历过:收到一个压缩包,双击后弹出一个简陋的界面&#x…

2026/8/23 9:16:48 阅读更多 →
【项目编号:project25518】Spring Boot 项目实战|研究生招生信息平台:报名、审核、录取与缴费全流程

【项目编号:project25518】Spring Boot 项目实战|研究生招生信息平台:报名、审核、录取与缴费全流程

Spring Boot 项目实战|研究生招生信息平台:报名、审核、录取与缴费全流程 Java Spring Boot MySQL|源码资料可领 #SpringBoot #Java #MySQL #研究生招生 #毕业设计 招生系统真正复杂的地方,不是简单的信息增删改查&#x…

2026/8/23 9:16:48 阅读更多 →

最新新闻

斯大林排序算法:从程序员梗到软件工程思维的极端映射

斯大林排序算法:从程序员梗到软件工程思维的极端映射

如果你在技术社区或社交媒体上看到“斯大林排序算法”这个词,第一反应是什么?是某个严肃的苏联计算机科学遗产,还是一个充满黑色幽默的程序员梗?答案是后者。这并非一个真正的、用于生产的排序算法,而是一个在程序员圈…

2026/8/23 10:02:02 阅读更多 →
Jellium Desktop 视频旋转:3 步矫正指南

Jellium Desktop 视频旋转:3 步矫正指南

Jellium Desktop 视频旋转:3 步矫正指南 【免费下载链接】jellium-desktop An unofficial desktop client for Jellyfin 项目地址: https://gitcode.com/GitHub_Trending/je/jellium-desktop 在 Jellium Desktop 播放手机拍的视频,发现它横躺了 9…

2026/8/23 10:02:02 阅读更多 →
C++可变参模板:从语法到实战的元编程核心

C++可变参模板:从语法到实战的元编程核心

1. 可变参模板:从“固定”到“无限”的C元编程跃迁 在C的世界里,模板一直是实现泛型编程、提升代码复用性的利器。但在C11之前,模板有一个明显的“天花板”:模板参数的个数必须是固定的。这意味着,如果你想写一个能处理…

2026/8/23 10:02:02 阅读更多 →
三步跑通 AI 命令行:自然语言转 Shell 命令全解

三步跑通 AI 命令行:自然语言转 Shell 命令全解

三步跑通 AI 命令行:自然语言转 Shell 命令全解 【免费下载链接】ai-shell A CLI that converts natural language to shell commands. 项目地址: https://gitcode.com/gh_mirrors/ai/ai-shell AI Shell 把自然语言转 Shell 命令:这是一个开源的 …

2026/8/23 10:02:02 阅读更多 →
用拉格朗日思维攻克技术难关:从畏惧到实战的高效学习法

用拉格朗日思维攻克技术难关:从畏惧到实战的高效学习法

最近在技术社区里,总能看到一种现象:面对一个全新的、看起来有点复杂的工具或概念,很多人第一反应是“等我有时间了再系统学”,或者“这得先看几篇论文才能搞懂”。结果就是,工具列表越积越长,真正动手的却…

2026/8/23 10:02:02 阅读更多 →
CUDA共享内存优化:从原理到实战,解决GPU内存瓶颈

CUDA共享内存优化:从原理到实战,解决GPU内存瓶颈

在GPU并行计算中,我们常常遇到一个瓶颈:虽然GPU的计算核心(SM)数量庞大,但数据从全局内存(Global Memory)到计算单元的搬运速度,远远跟不上计算单元的处理速度。这就像拥有一个超级高…

2026/8/23 10:01:02 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →