
动态规划
文章平均质量分 67
动态规划
hnjzsyjyj
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
洛谷 P1410:子序列
● 状态:f[i][j]代表 前 i 位中长度为 j 的最长上升子序列的最后一位的大小。● 状态转移方程:f[i][j]=min(f[i][j],f[i-1][j-1]),if(a[i−1]<a[i])f[i][i-j+1]=min(f[i][i-j+1],a[i-1]),if(f[i−1][j−1]<a[i])原创 2025-08-02 05:00:00 · 213 阅读 · 0 评论 -
AcWing 272:最长公共上升子序列 ← 子序列问题
本题是“AcWing 895:最长上升子序列”和“AcWing 897:最长公共子序列”的结合版,在状态表示和状态计算上都是融合了这两道题目的方法。原创 2025-08-02 00:30:00 · 376 阅读 · 0 评论 -
AcWing 897:最长公共子序列 ← 子序列问题(n≤1e3)
● 本题问题规模 1e3,所以采用如下经典动态规划方法求解是可行的。● 若问题规模大于 1e3,采用本题代码将会导致 MLE 及 TLE。则优化的“最长公共子序列”问题的代码解析详见:https://blog.csdn.net/hnjzsyjyj/article/details/149813893原创 2025-08-01 12:01:38 · 459 阅读 · 0 评论 -
洛谷 P1439:【模板】最长公共子序列 ← 子序列问题(n>1e3)
本题算法解析中求“最长公共子序列”问题的代码,适用于 n≤10^3 的场景。原创 2025-08-01 10:51:18 · 282 阅读 · 0 评论 -
AcWing 1479:最大子序列和 ← 子序列问题
设 dp[i] 表示以第 i 个元素结尾的连续子序列的最大和。状态转移方程为:dp[i]=max(a[i], dp[i-1]+a[i])。若 dp[i-1]+a[i]<a[i],说明当前元素作为新子序列的起点更优,此时置 t=i,以备未来更新起始下标 b 用。若 ans<dp[i],说明发现更大的子序列和,则更新全局最大值 ans,并更新当前子数组的起始下标 b(来自 t)和结束下标 e(当前 i)。若所有子数组和均为负数(ans<0),则强制输出和 0,并默认取整个数组范围 [1, n]。原创 2025-08-01 01:15:00 · 360 阅读 · 0 评论 -
AcWing 895:最长上升子序列 ← 子序列问题
状态定义:dp[i] 表示以第 i 个元素结尾的严格单调递增子序列的长度。切记,选取的元素不一定连续。原创 2025-07-31 15:02:59 · 311 阅读 · 0 评论 -
洛谷 P1115:最大子段和 ← 动态规划+优先队列
● 子序列问题是指在一个序列(如数组、字符串等)中,寻找满足特定条件的子序列的算法问题。子序列指的是从原序列中依序选取的元素组成的新序列,但选取的元素不一定连续。● 子序列问题求解的核心思路:通过分解子问题,利用动态规划或特殊数据结构进行优化。不同变体需要灵活调整状态定义和转移条件。原创 2019-09-01 15:33:14 · 226 阅读 · 0 评论 -
洛谷 P11230:[CSP-J 2024 T4] 接龙 ← 图论+动态规划
本题是一个典型的图论可达性问题,结合动态规划思想解决特定条件下的路径查询。原创 2025-07-30 11:14:45 · 918 阅读 · 0 评论 -
0-1 背包问题的状态转移方程
0-1 背包问题的状态转移方程为:f[i][j]=max(f[i-1][j],f[i-1][j-vol[i]]+val[i])f[j]=max(f[j], f[j-vol[i]]+val[i])原创 2025-04-25 07:00:21 · 454 阅读 · 0 评论 -
动态规划分析方法:闫氏DP分析法 + 最后一步法
动态规划分析方法:闫氏DP分析法 + 最后一步法原创 2025-04-22 07:01:26 · 161 阅读 · 0 评论 -
AcWing 11:背包问题求方案数 ← 0-1背包
设 f[i] 为背包容积为 i 时的最佳方案的总价值,cnt[i] 为背包容积为 i 时总价值为最佳的方案数。由于背包里什么也不装也是一种方案,故初始化所有的 cnt{i] 为1。如果装新物品的方案总价值更大,那么用 f[j-vol]+val来更新 f[j],用 cnt[j-vol] 更新 cnt[j]。如果总价值相等,那么最大价值的方案数就多了 cnt[j-vol] 种。原创 2025-04-19 23:09:44 · 543 阅读 · 0 评论 -
洛谷B3862:图的遍历(简单版)← 链式前向星
“链式前向星”就是“多单链表”,每条单链表基于“头插法”并用 e[]、ne[]、h[] 、val[] 等数组进行模拟创建。其中:e[idx]:存储序号为 idx 的边的终点值ne[idx]:存储序号为 idx 的边指向的边的序号(模拟链表指针)h[a]:存储头结点 a 指向的边的序号val[idx]:存储序号为 idx 的边的权值(可选)原创 2025-04-19 12:28:47 · 911 阅读 · 0 评论 -
AcWing 12:背包问题求具体方案 ← 0-1背包
在 0-1背包问题 中,如果我们希望按字典序输出方案(即优先选择编号小的物品),通常需要逆序遍历物品(从 N 到 1)进行动态规划,然后再正序遍历(从 1 到 N)回溯方案。原创 2025-04-18 20:52:02 · 471 阅读 · 0 评论 -
AcWing 2:01背包问题 ← 二维 / 一维
(1)0-1背包问题(0-1 Knapsack Problem) 是经典的动态规划问题,属于组合优化领域。它的核心是在有限容量的背包中,选择一组物品(每件物品只能选或不选),使得总价值最大,同时不超过背包容量。(2)0-1背包问题的名称源于每件物品只有“选”或“不选”两种状态,即“1”或“0”,故称 0-1 背包。(3)0-1背包问题中的每件物品既不能拆分,也不能重复选。原创 2025-04-18 13:36:22 · 564 阅读 · 0 评论 -
AcWing 5887:拼题A打卡奖励 ← 0-1背包问题
典型的 0-1 背包问题。原创 2025-04-17 07:38:44 · 207 阅读 · 0 评论 -
洛谷 P1176:路径计数2 ← 动态规划
● 设 f[i[[j] 表示机器人从左上角 (1,1) 走到 (i,j) 的走法,由于机器人只能向下或向右走,故利用动态规划法分析可得:f[i][j]=f[i-1][j]+f[i][j-1]。● 由于本题附设了障碍,故若障碍在 (i-1,j) 或 (i,j-1) 处,则对走法的贡献为 0。原创 2025-03-29 06:42:23 · 545 阅读 · 0 评论 -
洛谷 B3635:硬币问题 ← 动态规划
● 最少硬币问题能否使用贪心法,跟硬币的面值是否为典范硬币系统有关。原创 2025-03-26 21:21:06 · 710 阅读 · 0 评论 -
AcWing 3643:上楼梯 ← 杭州电子科技大学考研机试题 + 动态规划
本题 1≤N≤20,所以可以用基础的动态规划算法来求解。若 N 很大,就需要结合高精度来求解了。原创 2025-03-25 00:30:00 · 434 阅读 · 0 评论 -
AcWing 1087:修剪草坪 ← 动态规划+单调队列优化
本题的状态转移方程为:dp[i]=max(dp[i],dp[j-1]+sum[i]-sum[j]),其中 j∈[i-k, i-1]原创 2024-12-23 03:15:00 · 1183 阅读 · 0 评论 -
洛谷 P4541:[ZJOI2011] 细胞 ← DP+矩阵快速幂
浙江2011年省选题目,有相当难度。原创 2024-10-24 11:36:59 · 1210 阅读 · 0 评论 -
AcWing 5292:跳台阶 ← 动态规划
此问题是“计数型”问题,适用于利用动态规划方法解决。原创 2024-10-07 00:12:40 · 393 阅读 · 0 评论 -
AcWing 1048:鸡蛋的硬度 ← 动态规划
● 状态f[i][j] 表示 i 层楼 j 个鸡蛋的情况下,所需的最少次数。● 状态转移分析设有 i 层楼 j 个鸡蛋,j 个鸡蛋在足够多的情况下,可以不用全部用完。(1)若不使用第 j 个鸡蛋,则状态更新为 f[i][j - 1];(2)若使用第 j 个鸡蛋,并在第 k(1~i) 层扔。若鸡蛋碎,则状态更新为 f[k - 1][j - 1]。若鸡蛋没碎,则状态更新为 f[i - k][j]。● 枚举扔的楼层 k,在所有可行方案中选择最大值即为最坏情况,答案就是这些情况的最小值。原创 2024-08-30 23:25:40 · 1011 阅读 · 0 评论 -
AcWing 1080:骑士 ← 树形DP+基环树
环形结构上的动态规划问题,是一种特殊的区间动态规划问题。由于存在“环形后效性”,所以不满足动态规划算法的“无后效性”约束条件。故常将环形结构上的动态规划问题,通过“断环为链”策略转化为线性动态规划问题求解。所谓“无后效性”,即“未来与过去无关”。所谓“断环为链”策略,即“把环断开为链,然后复制一倍接在末尾”。原创 2024-07-25 21:18:57 · 892 阅读 · 0 评论 -
洛谷 P2661:信息传递 ← 树形DP+拓扑排序+dfs
● 链式前向星:https://blog.csdn.net/hnjzsyjyj/article/details/139369904原创 2024-07-25 15:32:06 · 439 阅读 · 0 评论 -
洛谷 P1057 [NOIP2008 普及组 T3]:传球游戏 ← 环形DP
不妨设小蛮为 0 号,所有人的编号是 0∼n−1。● 环形动态规划(1)状态 f[i][j]:表示球传了 i 次后,在小朋友 j 手中的方案数。(2)利用最后一步法确立状态转移方程:f[i][j]=f[i-1][j-1]+f[i-1][j+1](3)显然,所求为 f[m][0]。其中,设 f[0][0]=1。原创 2024-07-17 22:01:22 · 485 阅读 · 0 评论 -
洛谷 P1095 [NOIP2007 普及组 T3]:守望者的逃离 ← 动态规划
● “跑步”时,每秒移动 17 米;“闪烁法术”时,3.5 秒(施法 1 秒+恢复 10/4 秒 = 3.5 秒)移动 60 米,等价于每秒移动 17+1/7 米。可见,“闪烁法术”稍快一些。因此,当时间允许时,一定要优先使用“闪烁法术”。故只在最后一小段没时间“闪烁法术”的时候,才使用“跑步”的方式。原创 2024-07-14 17:22:09 · 438 阅读 · 0 评论 -
AcWing 96:奇怪的汉诺塔 ← 动态规划
● 情况讨论(1)二塔:圆盘个数为1时,最小移动次数为1。其他情况下为0。(2)三塔:将n-1个圆盘移到B,将最大圆盘移到C,将n-1个圆盘移到C。故有:d[n]=d[n-1]+1+d[n-1](3)四塔:将 i 个圆盘移到B(1≤i≤n)。剩余 n-i 个盘为三塔问题,故最小移动次数为 d[n-i]。最后,将 B 塔上的 i 个圆盘移到到 D 塔。故总的最小移动次数为:f[n]=min(f[n], f[i]+d[n - i]+f[i]),其中 0原创 2024-07-12 12:49:44 · 406 阅读 · 0 评论 -
AcWing 1073:树的中心 ← 树形DP
树形 DP 常用的数组:d1[u]:从当前结点 u 向下走的最长路径长度d2[u]:从当前结点 u 向下走的次长路径长度up[u]:从当前结点 u 向上走的最长路径长度p1[u]:从当前结点 u 向下走的最长路径是从哪个结点开始的p2[u]:从当前结点 u 向下走的次长路径是从哪个结点开始的原创 2024-07-09 16:17:17 · 2194 阅读 · 0 评论 -
AcWing 217:绿豆蛙的归宿 ← 搜索算法
● 本题用到概率论中数学期望的线性性质原创 2024-05-24 00:01:43 · 433 阅读 · 0 评论 -
洛谷 P1002:过河卒 ← 动态规划
● 这是一道典型的动态规划算法题目。设 f(i,j) 表示从 (0,0) 走到 (i,j) 的路径的条数。如果 i=0 且 j=0,则 f[i][j]=1;否则,如果i=0,则 f[i][j]=f[i][j−1];否则,如果 j=0,则 f[i][j]=f[i−1][j];否则,f[i][j]=f[i−1][j]+f[i][j−1]。原创 2024-05-13 22:35:32 · 603 阅读 · 0 评论 -
牛客网:S老师的签到 ← BFS
● BFS 有“分层”的核心思想,故在本题中以 x+y 相同的值作为“分层”的依据。即若从某位置开始,则位于同一层的是 x+y 的值相同的位置。其中,x 是向下走的距离,y 是向右走的距离。● C++11 标准中的 for 循环,用 auto 以简洁、统一的方式来遍历容器和数组。● 运算符 ^ 表示按位异或。原创 2024-04-28 07:31:11 · 963 阅读 · 0 评论 -
第十五届蓝桥杯第三期模拟赛第十题 ← 上楼梯
本例用到的 vector 语法简介vector v(10); // 定义了10个 int 类型元素的向量 v,未初始化;vector v(10,1); //定义了10个 int 类型元素的向量 v,每个元素初始化为1。原创 2024-03-29 22:20:45 · 1580 阅读 · 0 评论 -
罗勇军 →《算法竞赛·快冲300题》每日一题:“乘积” ← 动态规划
设输入的序列是 a[1]~a[n],依据最后一步法,可定义 DP 状态为:f[i][0]:以 a[i] 结尾的积为 -1 的连续子序列个数f[i][1]:以 a[i] 结尾的积为 1 的连续子序列个数例如,针对样例{1, 1, -1, -1},有 f[1][1]=1,f[2][1]=2,f[3][1]=0,f[4][1]=3。原创 2023-08-23 19:28:18 · 648 阅读 · 0 评论 -
单调队列 → 常用于动态规划问题的优化
单调队列是指在队尾入队出队,在队首出队,且其元素具有单调性的特殊队列。其中,在队尾入队出队的操作是用来维护单调队列的单调性,在队首出队的操作是用来维护单调队列的大小。单调队列常用于动态规划问题的优化。★构建单调递减队列的目的在于求最大值,求最大值时的操作为“大覆盖,小附加”★构建单调递增队列的目的在于求最小值,求最小值时的操作为“小覆盖,大附加”......原创 2022-08-17 11:15:10 · 623 阅读 · 0 评论 -
混合背包问题 → 不是什么难题
混合背包问题并不是什么难题,它只是0-1背包问题、完全背包问题、多重背包问题等的组合而已。也就是说,在混合背包问题中,有些物品只能取一次(0-1背包),有些物品可以取无限次(完全背包),有些物品可以取有限次(多重背包)。只要深刻理解了0-1背包、完全背包、多重背包等基本背包问题的核心思想,就可以将混合背包问题拆分成若干基本的背包问题来解决。...............原创 2022-08-11 15:11:10 · 425 阅读 · 0 评论 -
拆分整数为2的幂次项和 → 理解多重背包问题二进制优化的核心思想
输入一个整数,输出为2的幂次项和的形式。例如:输入26,输出26=1+2+4+8+11输入7,输出7=1+2+4原创 2022-08-09 12:21:27 · 777 阅读 · 0 评论 -
二维费用的背包问题 ← 模板题
令 c[i][j][k] 表示将前 i 个物品装入限制条件1为 j、限制条件2为 k 时,可获得的最大价值。根据求解普通0-1背包问题的状态转移方程的思路,相应可得二维费用的0-1背包问题的状态转移方程为:c[i][j][k] = max(c[i−1][j][k], c[i−1][j−vol1[i]][k−vol2[i]] + val[i] )二维优化为 c[j][k] = max(c[j][k], c[j−vol1[i]][k−vol2[i]] + val[i])...原创 2022-08-08 16:29:48 · 301 阅读 · 0 评论 -
二维费用背包问题的解题套路
二维费用的背包问题,即具有两种限制条件的背包问题,它是常见背包问题的一个简单的常见扩展。也就是说,常见的背包问题都会存在二维费用的扩展。如二维费用的0-1背包问题、二维费用的完全背包问题、二维费用的多重背包问题、二维费用的分组背包问题等。...原创 2022-08-08 16:05:13 · 788 阅读 · 0 评论 -
潜水员 ← 二维费用的背包问题
二维费用的背包问题,即具有两种限制条件的背包问题,它是常见背包问题的一个简单的常见扩展。也就是说,常见的背包问题都会存在二维费用的扩展。如二维费用的0-1背包问题、二维费用的完全背包问题等。二维费用的0-1背包问题的状态转移方程为:c[i][j][k] = max(c[i−1][j][k], c[i−1][j−vol1[i]][k−vol2[i]] + val[i] )优化为二维 c[j][k] = max(c[j][k], c[j−vol1[i]][k−vol2[i]] + val[i])......原创 2022-08-08 15:50:26 · 429 阅读 · 1 评论 -
HDU 1712:ACboy needs your help ← 分组背包问题
题目大意:一个学生用 M 天的时间复习 N 门课程。已知花费在课程上的天数不同,将会有不同的收益。但是根据样例,并不是花费在课程上的天数越大,收益就越大。所以,请问如何安排这 M 天,可使得收益最大?解题思路:本题本质上是一个分组背包问题。可将每门课看成一个分组,每门课选择花费的不同天数看成是分组中的不同物品。显然,每组只能选择一个天数。这是因为花费在某门课上的天数,不可能即是 X 天,同时又是 Y 天,只可能是单选。本题中组数为 N,背包容量为M。......原创 2022-08-07 12:11:36 · 236 阅读 · 0 评论