动态规划
陈末iiiiiiiiiiii
Retired
展开
-
Codeforces Round #718 (Div. 1 + Div. 2) D 棋盘步数回路 DP 动态规划 思维
给你一个大小N*M的棋盘网格,网格的每条线都有一条无向边,以及它的权值。要求求每个点出发走K步后回到起点的最小权值和。当K为奇数是必然回不到起点。特判。因为它是回路,我们只需求走k/2步的最小值再*2即可。然后就是DP状态定义F[i][x][y]从x,y出发走了i步的最小权值和。如何转移?因为无向边,所以我们走k步最小到达的点,必然我们可以反向的到达回去。相当于将状态等价为F[i][x][y]从未知点走了i步后到达x,y最小权值和。(这里很思维)这样我们就能很轻松的写出如下的转移方程。原创 2022-07-06 21:53:07 · 137 阅读 · 0 评论 -
2019银川区域赛 K题 Largest Common Submatrix 子矩阵(单调栈,悬线法两种解法)
给你两个矩阵矩阵内的数字为N*M的排列。找出两矩阵的子矩阵能相等的最大大小。N,M原创 2022-07-03 17:47:01 · 361 阅读 · 2 评论 -
Codeforces Round #697 (Div. 3) G 线性dp 调和级数 数论
题目Polycarp 在街上发现了一个包含 n 个元素的数组。Polycarp 发明了他的阵列美感标准。如果每对不同的索引 i≠j 必须满足以下条件中的至少一个,他就称数组为美数组:ai 可被 aj 整除;或 aj 可被 ai 整除。例如,如果:n=5 and a=[7,9,3,14,63],则a数组不美观(对于i=4 and j=2,以上条件都不满足);n=3 且 a=[2,14,42],则 a 数组很漂亮;n=4 且 a=[45,9,3,18],则 a 数组不美观(对于 i=1 和 j=原创 2022-05-05 17:25:11 · 819 阅读 · 0 评论 -
Codeforces Round #667 (Div. 3) E 双指针预处理线性dp
题目给你两个长度为K的板子,有N个往下掉的点,问最多能装多少个点。题解思路处理放左右两个部分的最大值再求和。和那道蓄意轰拳有点像。参考链接AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define ll long longusing namespace std;const int INF =原创 2022-04-30 13:58:31 · 312 阅读 · 0 评论 -
牛客xb赛48 F 孤独的树 树形dp 处理森林 筛法
题目传送门题解思路因为N最大就是1e5,所以对与每个权值他最多只能有6个不同的质因子。我们每次只能去除一个质因子,所以,如果要去除这个点的这种质因子就多次去除这个即可。我们从最大的质因子不断往小删。这样就能O1获取我们此时到底要删谁。有相同质因子的点可以构成森林(多个连通块),我们对每个连通块,每次都处理掉一种质因子,这样就能保证复杂度在Nlog(N)。对于每个连通块处理同种质因子有树形dp来计算最小的次数,最后再累加。dp[i][0] 表示以i为根节点的子树,根节点不进行删除操作使得满足原创 2022-04-24 15:19:08 · 1449 阅读 · 0 评论 -
AtCoder Beginner Contest 247 E 双指针维护固定最大最小值区间的数量 状压DP
题目给你一个大小为n的数组A,以及一个X和Y。要求求出满足最大值为X且最小值为Y的区间数量。数据范围题解思路很久没写双指针题了,有点不太行,所以一直没自己补出来,一开始看的dls的状压dpdp[i][0/1][0/1] 定义为以i为右端点的连续区间中 有或者没有最小值Y有或者没有最大值X的数量。再通过此时的a[i]值来更新到这个点的数量。每次取dp[i][1][1]即可。梦中把这题用双指针补了。结果思路真是对的,官方题解也讲了双指针,可惜我看不懂英文。所以才只能自己推。我们只需维原创 2022-04-14 14:05:42 · 692 阅读 · 0 评论 -
AtCoder Beginner Contest 244 E 线性dp 动态规划 图论
题目给你N个点M条无向边。要求求出从点S出发,点T为终点的路径中路径长度为K且经过点X偶数次(包括0次)的路径数有多少条。N <= 2000M <= 2000答案对998244353取模题解思路想了半天什么dfs什么组合数学都出来了。直接dpf[i][j][k] 走了i步停在j点经过X点的奇偶性为k(0或者1)的路径数。初始化f[0][s][0] = 1 ;转移对于k步枚举所有边,如果是X点就改变k的奇偶性,不是就直接加。AC代码#include <bi原创 2022-03-22 16:45:57 · 1044 阅读 · 0 评论 -
AtCoder Beginner Contest 244 F 多源BFS 状态压缩 位运算 动态规划
题目给你N个点M条无向边的图,每个路径可以被定义为一个序列,AAi,表示路径经过这个点的奇偶性只有1 (奇)0(偶) ,特别的经过0次时属于偶。要求求出序列A的每种情况(即一共2的N次方种情况)的最短路径大小的总和。N <= 17题解思路因为数据范围小,考虑状态压缩,当这个状态的点经过一条边变成另一种状态的时候,就是将两种状态进行异或处理。这样我们只将所有起点状态放入队列中跑bfs,即多源bfs,就能处理除其他状态的最短路径大小。每个状态又必须又对应的边来转移,所以我们的dis数组需原创 2022-03-22 16:30:11 · 937 阅读 · 0 评论 -
Educational Codeforces Round 122 (Rated for Div. 2) D 01背包 动态规划
题目你有一个大小为 n 的整数数组。 最初,a数组的所有元素都等于1。可以执行以下操作:选择两个整数i(1≤i≤n)和x(x>0),然后将ai的值增加⌊aix⌋( 即使 ai=ai+⌊aix⌋)。执行完所有操作后,您将收到 ai=bi 的所有 i 的 ci 币。您的任务是通过执行不超过 k 个操作来确定您可以接收的最大硬币数量。n <= 1e3bi >= 1bi <= 1e3k <= 1e6题解思路因为b数组的值都比较小,我们可以先预处理出从1到达每个比100原创 2022-02-14 20:00:01 · 555 阅读 · 0 评论 -
Educational Codeforces Round 90 (Rated for Div. 2) D DP 最大子段和 差分
题目给你一个有n个元素的数组A。选择两个连续的 l r l < r 翻转数组只能通过一次或者0次翻转,使得数组的偶数位和最大。题解思路如果数组进行了翻转,可能选择奇数开始偶数结束,或者相反,这样就可以让这一段的奇数偶数总和互换。放到数组上,就是两种情况。从 i - 1 到 i 或者从 i 到 i + 1 。i为偶数。我们做出差分数组。求这个差分数组里的最大子段和不就是可以增加的最大值了吗。最大子段和AC代码#include <bits/stdc++.h>原创 2021-12-28 16:37:33 · 616 阅读 · 0 评论 -
AtCoder Beginner Contest 232 F 状态压缩DP 逆序数
题目给你两个长度为N序列A B 。你有两种操作可以选择将一个数bi + 1 或者 - 1 费用为X将bi 与 bi+1 交换 费用为 Y求将两个序列变的一模一样的最小费用题解思路运算二进制来代表b中的那些数被固定了 0 1 ,这样就可以生成一个状态1 << n 来代表到达这个状态的最小费用。状态中有几个1就代表a对齐了a中的几个数,所以,在状态更新的时候,我们先统计这个状态有几个1,并且记录。这样可以知道我们枚举数来对其哪个a。除了用这个数来和a相等的费用,还有这个数原创 2021-12-20 19:55:21 · 378 阅读 · 2 评论 -
AtCoder Beginner Contest 232 E 线性DP 组合数学
题目有一个H*M的棋盘,起初小车在x1 , y1 ,小车要到达x2 , y2 。小车每次操作只能到达棋盘中同行或者同列的某个位置。要求计算小车从起点到达终点,并且恰好使用K次操作的方法数。答案对998244353取余。题解思路这种问题可以先想想将行列分开考虑。我们可以根据最后一个不同点来划分,即小车到没到达目标的行或列。以横坐标为例即dp[ i ] [ 0 ] 表示小车走了 i 步 走完后不在 目标的列 ,1 表示在目标的列 的所有合法方案 。根据这个条件 , 很容易得原创 2021-12-20 17:33:45 · 460 阅读 · 2 评论 -
牛客xb月赛34 B 状态压缩DP
题目题解思路将每个点跳或者不跳转化成二进制来表示状态。dp[ i ] [ j ] [ k ]集合 表示 当前状态为i,且在站在j上,使用两次加速的情况为 k 的 所有合法方案的代价 。属性 代价的min转移方程其实挺好推的,因为是很明确的哪个点到哪个点。(就是不要漏了情况)参考题解AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pai原创 2021-12-09 13:44:38 · 188 阅读 · 0 评论 -
1069. 凸多边形的划分 区间DP + 高精度 贴个高精模板方便以后用
题目题解思路参考这个图形,即我们可以通过两个边来确定图形的形状。dp的题解真的很难写 ,可能时我的理解还不到位,看大佬的题解吧。参考彩签大佬的题解这题样例就爆longlong了。所以得高精或者int128主要是为了贴个高精模板AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<int,int>#define LL long原创 2021-12-09 11:54:36 · 172 阅读 · 0 评论 -
4078. 01串 状态机DP 动态规划
题目题解思路集合定义dp [ i ] [ 2 ]考虑长度为i的合法串中以1或者0结尾的字符串数量考虑的两种状态即连着N*K个1并且以1结尾,或者以0结尾。初始条件dp[ 0 ] [ 0 ] = 1dp[ k ] [ 1 ] = 1转移0的情况可以从前一个合法情况中以1 0 结尾转移而1的情况可以从i-k的以1为结尾的情况加K个1,或者在以0结尾的情况加K个1。转移完了求个前缀和输出即可。注意减法取模的影响。AC代码#include <bits/stdc++原创 2021-11-21 11:54:49 · 99 阅读 · 0 评论 -
2021牛客寒假算法基础集训营3 I 贪心 + 最大不相交区间数 好题 线性DP 动态规划
题目题解思路一开始其实是想dp的,想了挺久的递推明明推对了又自我否定了。然后想到了我们最后的序列肯定是类似两个两个相同的连接起来,我们要是把所有两个相同的两个端点变成一个区间。那这题岂不是队最大不相交区间数的问题了,直接排序贪心取即可。动态规划也行的。定义dp[i]为前i 个 数组成的合法子序列中 美观度的最大值转移方程dp[ i ] = max( dp[ i-1 ] , dp[ last[i] ] +1)即可以从之前选择的这个数的最优情况来更新此时的最优AC代码贪心 + 最大原创 2021-11-20 14:41:53 · 394 阅读 · 0 评论 -
力扣375. 猜数字大小 II 记忆化搜索 区间DP 最小化最大值
题目样例1 160<= n <= 200题解思路一般这样最小化最大值都是二分来解决的,这题貌似用不了二分。数据量小直接爆搜(记忆化)枚举两个区间中选择的每一个点,取两种分支的最大值,加上费用后取最小值更新答案。即在每个最大分支中取最小值状态表示 dp[ i ] [ j ] i 到 j 的序列中 选择的花费的最小的最大值。状态转移和记忆化搜索一样。按照区间dp的套路初始化好搞好边界就能AAC代码记忆化搜索const int INF = 0x3f3f3f3f;原创 2021-11-12 17:35:26 · 66 阅读 · 0 评论 -
力扣629. K个逆序对数组 斜率优化 省去前缀计算 动态规划
题目题解思路状态表示前i个数中逆序对为j个的情况数状态转移第i个数有可以放的位置为( 1 , i ) , 设放的位置为K ,则会产生 (i - k )个逆序对,这样i-1只需提供j-(i-k)个节点,对K的所有位置进行求和就是转移到i j的所有情况了。这样转移方程就是还可以进行优化,这样就可以就不用前缀和了。AC代码const int mod = 1e9 + 7 ; long long dp[1010][1010] ; class Solution {public:原创 2021-11-11 21:40:05 · 92 阅读 · 0 评论 -
牛客xb月赛 B 区间DP + 环形两倍空间优化
题目题解思路看了一会区间DP,还没看太懂。知道递推式是对的,但是不会推。这题和环形合并石子不同,当确定了起点后,只能往左边或者右边走了。这样就不需要第三维的K了,确定了len和左右端点,就能知道要么从左边推过来要么从右边推过来了。环形石子合并有点用了分治的思想,通过局部优推出全局优。AC代码#include <bits/stdc++.h>//#include <unordered_map>//priority_queue#define PII pair<原创 2021-11-07 18:56:04 · 114 阅读 · 0 评论 -
2021 ICPC 江西省大学生程序设计竞赛 A 状态机DP 滚动数组优化 没写出属实可惜
题目给出n*m的只含0 1 的 棋盘问从1 1 开始走到n m 的所有方案中至少有 p 个 0 和 q 个 0 的所有方案数。只能往下或者往右走。0 <= n , m <= 500答案模998244353题解思路这个取模在提醒我们方案数会很大,bfs肯定不行。所以我们转移思路到dpdp [ i ][ j ] [ k ]表示从1 1 走到 i j 的 所有恰好包含 k 个 0 的方案数。因为只能走两个方向,所以我们很容易推出转移方程。但是这样内存会爆炸(牛客网原创 2021-10-24 14:47:14 · 198 阅读 · 0 评论 -
3662. 最大上升子序列和 树状数组 + 离散化 维护区间最大值
题目题解思路把最长公共子序列的模型优化成nlogn。可以使用树状数组优化,即每个编号点存对应的排序数(排序后应该在第几位)。(以便更新的时候直接更新前缀最大值)如果要用树状数组这样表示的话(直接查找一段区间的类似逆序情况,在不断更新的情况下保证了连续性。),就必须存这个数的真实值,但真正值过大,所以我们可以进行离散化。树状数组存以这个数为结尾的上升子序列和的最大值。参考文章AC代码#include <iostream>#include <cstdio>#incl原创 2021-10-21 17:06:56 · 125 阅读 · 0 评论 -
2021广东省大学生程序设计竞赛 J DP完全背包 预处理 BFS
题目初始位置是0,目标位置是 K每次只能向前或者向后走 平方数的步数 例如 1 4 9 16 25 …求到达目标的最小步数 。题解思路先预处理出平方数大概320个数左右,每个平方可以使用的次数的无限的,(使用次数)容量也是无限的。直接对每种背包(平方数)进行完全背包处理。因为可以往前走也可以往后走,所以先将正向1e5的数正向走这个背包+权值。再反向走-这个权值。这样就能预处理出所有答案了。这种查询和输出相同复杂度的就只能往预处理方向思考!使用bfs进行限制步数的预处理也是可以的。AC代原创 2021-10-17 19:50:33 · 88 阅读 · 0 评论 -
AtCoder Beginner Contest 222 D Between Two Arrays 动态规划
题目给定两个长度为n的非递减序列 a b定义 序列c满足ai <= ci <= bi0 <= ai <= bi <= 30001 <= n <= 3000求出 序列 c 有多少种可能。题解思路定义 f[i][j] 为 前i个数字中以j为结尾的非递减序列 的 总数 。只需满足前一项的小于等于第 i 项即可 。f [ i ] [ j ] = f [ i - 1 ] [ 0 ] + f[i-1][1] -----原创 2021-10-10 18:50:11 · 203 阅读 · 0 评论 -
1252. 搭配购买 并查集 + 01背包
题目题解思路利用并查集将搭配合并起来 。将每个连通块 进行 01 背包操作 这样复杂度最大 m*w 再对01背包进行一维优化 即可。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>#include原创 2021-09-27 17:49:42 · 95 阅读 · 0 评论 -
AtCoder Beginner Contest 220 D 线性DP 初始化注意项 动态规划
题目给你一个长度为N的序列 (只有 0 到 9 的数) , 你要进行操作F或者G使序列只有一个数F删除最左边两个数 a b 插入 ( a + b) % 10G删除最左边两个数 a b 插入 ( a* b) % 10题解思路之间枚举肯定是不行的 , 让我们想到dp。定义集合 f[ i ] [ j ] 操作了i 次 最左边的数为 j 的 情况的总次数 。f[ 0 ] [ a[0] ] = 1操作0次 最左边肯定是 a[ 0 ] 初始化转移我们不知道前一个数到底是什么原创 2021-09-27 10:44:04 · 92 阅读 · 0 评论 -
1058. 股票买卖 V 线性DP+状态机模型DP 动态规划
题目题解思路看清题目要求 确定好每个状态的转移 和入口 起点将起点初始化 为 0 非起点全为 - INF再写出转移方程即可参考文章AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>#includ原创 2021-09-22 16:05:37 · 72 阅读 · 0 评论 -
1057. 股票买卖 IV 状态机模型 恰好体积类问题 动态规划
题目题解思路当买入时 总值 + w[ i ] 卖出时 总值 - w [ i ] 就自动换算利润了一开始没看清很自然的定义 f [ i ] [ j ] [ 0 ] 不持有 f [ i ] [ j ] [ 1 ] 持有考虑前 i 天的股票,第 i 天的 决策 是 k ( 0 1 ),且完成的 完整交易数 为 j 的方案再分析两个状态之间的交互情况 推出转移方程大细节这里是定义的 完整交易数 也就是恰好问题真正的答案就需原创 2021-09-20 19:38:26 · 59 阅读 · 0 评论 -
1049. 大盗阿福 状态机DP模板 动态规划
题目题解思路f[ i ][ j ]集合 所有走了 i 步且 状态为 j 的情况对于这个点 选还是不选 分为 0 1 两种状态再根据他们之间的关系列出转移方程AC代码//状态机做法#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#原创 2021-09-20 17:59:17 · 89 阅读 · 0 评论 -
734. 能量石 贪心优化问题 + 恰好体积V01背包 动态规划
题目题解思路一开始想直接用 L排序S 和 L 肯定有关系的 所以不能直接做大佬直接推出最优的选择次序了。这样我们只要在这些答案里选出最优即可。因为有些会被消耗完。求恰好的背包DP,为了保证状态都是从起点转移的,要把非起点初始化为无穷大以避免转移而且 这里我们是用最大的体积来枚举所有选择方法,所以恰好用最大的体积时不一定最优,还要往前寻找。墨染空大佬的文章AC代码#include <iostream>#include <cstdio>#include原创 2021-09-20 17:02:12 · 89 阅读 · 0 评论 -
12. 背包问题求具体方案 逆向01背包 后推出字典序最小 动态规划
题目题解思路在 机器分配 我们已经求过具体方案了,但是这回是要求字典序最小。机器分配的思路就是先跑一次01背包 然后从结果往前推出答案 。这样的思路在这题是行不通的,从后往前就很难保证是字典序最小了。闫总之间反向跑01背包,让最大值结果在F[ 1 ][ m ] 中,然后从1开始往后面推,这样肯定可以保证字典序最小。闫总这波逆向思维属实nbAC代码#include <iostream>#include <cstdio>#include <cs原创 2021-09-20 15:38:52 · 341 阅读 · 1 评论 -
11. 背包问题求方案数 01背包变式 动态规划
题目题解思路在求最大值的过程中 附加求方案数的dp 即可由于定义是使用至多 M 体积 达到的最大值 所以在 M 体积之前可能也存在最优方案 所以要往回循环判断一次参考文章AC代码//一维写法#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#inc原创 2021-09-20 11:30:15 · 91 阅读 · 0 评论 -
487. 金明的预算方案 分组背包 + 二进制枚举 动态规划
题目题解思路对于每一组的物品 ,如果我们要选择就必须先选主物品,再选择其他的。因为附属品的个数不超过2个所以我们可以进行二进制枚举 2的2次方的复杂度 。这些来看就是分组背包的问题了。我们枚举的其实就是决策。在每个主物品下的每个体积的情况下枚举决策出最优情况这里vector二维pair的运用也挺好的参考文章和闫总视频AC代码#include <iostream>#include <cstdio>#include <cstring>#includ原创 2021-09-20 10:08:29 · 80 阅读 · 0 评论 -
1013. 机器分配 分组背包变式 逆推出决策情况 动态规划
题目题解思路把设备数看成体积就是和分组背包一模一样了这里逆推出决策情况的很巧妙从最后一次的决策由来往前推 不断减少体积 找到答案参考文章AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>#i原创 2021-09-19 18:51:28 · 94 阅读 · 0 评论 -
9. 分组背包问题 多重背包变式 动态规划
题目题解思路AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>#include <string>using namespace std;const int INF = 0x3f3f3原创 2021-09-19 18:34:25 · 103 阅读 · 0 评论 -
1020. 潜水员 01背包 二维费用‘不少于‘问题 动态规划
题目题解思路因为定义是至少 所以小于目标体积的数也是需要转移的小于0是有实际意义的求最小值要把除初始状态以外的所有状态初始化为+∞参考文章另外还有不同体积的初始化技巧在图片中AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#incl原创 2021-09-19 15:57:49 · 98 阅读 · 0 评论 -
7. 混合背包问题 三种背包结合运用 动态规划
题目题解思路因为状态方程 相同 ,我们只需要让每种背包符合它自己的要求转移即可给出两种优化多重的代码都优化为一维了AC代码使用单调队列优化多重#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>#includ原创 2021-09-18 19:11:52 · 84 阅读 · 0 评论 -
6. 多重背包问题 III 单调队列优化 复杂度 n*m 动态规划
题目题解思路参考这个文章和闫总的视频讲解每个体积下的余数都对应着一个滑动窗口 , 用单调队列来进行优化处理这样每个物体就只走了M次在出入队时,要将体积差距下的W给补上。方程推导是我将不明白的AC代码//单调队列优化多重背包 二维写法方便理解 //一维写法 使用拷贝数组#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include &原创 2021-09-18 17:36:38 · 117 阅读 · 0 评论 -
532. 货币系统 完全背包应用 求最大无关向量组 类似埃式筛的思想 动态规划
题目题解思路a中的任意组合都必须用b能表示出来,a表示不了的b也表示不了。b中的任意元素用b中的另外的无法表示这不就是 线性代数里的最大无关向量组吗怎么求我们可以用完全背包来 弄出体积内能表示的所有 数 并把他们筛去 ,无法表示的数就是最小线性无关组的元素了 。而且 大数肯定是由小数表达出的所以 我们从小到大排序 并且按这个顺序 跑完全背包 传递是否可以表示。参考大佬的题解AC代码#include <iostream>#include <cstdio>原创 2021-09-18 11:47:58 · 56 阅读 · 0 评论 -
278. 数字组合 01背包变式 方案选择总数 动态规划
题目题解思路F [ i ] [ j ]集合 (从前 i 个物品中 选 体积总数为J 的所有方案 )属性 sum如何转移 (由最后一个差距划分)状态计算选f[i][j] = f[i-1][j] + f[ i-1 ][ j - a[i] ]不选f[i][j] = f[i-1][j]因为转移方程缺少初始值所以我们必须 定义 初始值 f[0][0] = 1 来让方程不断计算AC代码//一维写法 根据状态为方案数 推出转移方程 又因为没有初始值 所以我们要添加初始原创 2021-09-18 09:47:50 · 97 阅读 · 0 评论 -
1022. 宠物小精灵之收服 01背包变式 二维费用 动态规划
题目题解思路花费1 精灵球花费2 体力值状态表示f[i , j , k ] 只从前i个商品中选 花费1不超过j 花费2 不超过 k-1 的所有抓捕方法的抓捕个数 最大值状态计算不选f[ i , j , k ] = f[ i-1 , j , k ] ;选f[ i , j , k ] = max(f[ i-1 , j , k ] , f[ i -1 , j - h[i] , k - w[i] ) ;最小体力值就直接往后搜出最佳答案即原创 2021-09-18 09:03:46 · 125 阅读 · 0 评论