动态规划
文章平均质量分 56
wind__whisper
qwq
展开
-
HDU5519:Kykneion asma(容斥)
巧妙的容斥计数原创 2022-05-15 23:05:54 · 195 阅读 · 0 评论 -
AT2366 [AGC012F] Prefix Median(dp)
对问题的转化原创 2022-05-01 23:40:40 · 236 阅读 · 0 评论 -
CF1267G Game Relics(期望、背包)
期望+背包原创 2022-05-01 20:39:31 · 267 阅读 · 0 评论 -
AT2000 [AGC002F] Leftmost Ball(dp、组合数学)
经典计数原创 2022-04-27 21:29:59 · 349 阅读 · 0 评论 -
P5363 [SDOI2019]移动金币(博弈论、dp)
阶梯博弈原创 2022-04-25 22:00:41 · 320 阅读 · 0 评论 -
CF1192B Dynamic Diameter(LCT)
LCT维护直径原创 2022-04-06 23:00:19 · 302 阅读 · 0 评论 -
CF1534F:Falling Sand(tarjan、贪心、dp)
解析本题做的过程大概是:到了正解门口决定回头,绕了地球一圈最后从另一边走到正解了…首先 easy version 很简单,如果从一列最大值可以走到另一列最大值,那么后者就没用了。缩完点所有的零度点就是答案。hard version 的问题就是选的点是最大值,但要求走到的点不一定是最大值。要求走到的点如果互相可达,那么可以被到达的也没用了,所以有用的点满足互不可达。那么如果到一个点够不到要求高度了,后面必然更达不到,所以选择每一列后可以满足的点必然是连续的区间。而且不难发现我选的列右移的时候,其满原创 2022-04-06 10:47:52 · 248 阅读 · 0 评论 -
P3746 [六省联考 2017] 组合数问题(倍增、dp)
披着组合数外皮的dp原创 2022-03-20 20:08:16 · 265 阅读 · 0 评论 -
YBROJ&洛谷P3211:XOR和路径(线性基,期望dp)
期望+高斯消元原创 2022-02-21 15:32:45 · 530 阅读 · 0 评论 -
YBTOJ&BZOJ:大根堆(启发式合并)
树上LIS原创 2022-02-20 09:58:19 · 217 阅读 · 0 评论 -
期望学习笔记
期望不可感性理解!原创 2022-02-05 18:12:17 · 804 阅读 · 0 评论 -
CF1631F:Flipping Range(dp)
重点在于题意的转化原创 2022-01-28 19:52:06 · 924 阅读 · 0 评论 -
洛谷P4389:付公主的背包(多项式、生成函数)
生成函数好题原创 2022-01-08 21:04:58 · 469 阅读 · 0 评论 -
洛谷P6097:【模板】子集卷积(FWT)
FWT练习原创 2022-01-05 07:27:52 · 395 阅读 · 0 评论 -
CF886E Maximum Element(dp、组合数学)
很经典的动态规划原创 2022-01-04 15:47:35 · 252 阅读 · 0 评论 -
模板:长链剖分
解决与深度有关的dp的利器原创 2021-12-19 15:49:37 · 363 阅读 · 0 评论 -
CF1540B Tree Array(期望,dp)
解析关于合理的实现这题卡在最后的小破dp是我没想到的一开始看到200的数据范围就不禁笑出了声lca直接On求!然后就开始大力分类讨论然后就卡在了一个问题上两个栈AB,分别有a和b个元素,随机从两个栈中弹出一个元素,求最后A栈先空的概率我天真的认为,上面那个东西就等于ba+b\frac{b}{a+b}a+bb然后样例3就卡住了。。。事实是一个简单的dp即可所以思路还是要灵通代码#include<bits/stdc++.h>const int N=205;con原创 2021-11-16 20:51:06 · 113 阅读 · 0 评论 -
P3642 [APIO2016]烟火表演(左偏树、函数)
解析感觉是左偏树的神题了.首先有一个比较显然的结论,一个合法的方案中,两个叶子到它们 lca\text{lca}lca 的距离必须相等.考虑设计 dp\text{dp}dp :fi,xf_{i,x}fi,x 表示 iii 的子树中,所有叶子到它的距离为 xxx 的最小代价.考虑这个函数如何向父亲合并.设一个结点到父亲的距离为 cic_ici .朴素 dp\text{dp}dp ,就有:fi,x=∑j∈soniminv≥0xfj,x−v+∣cj−v∣f_{i,x}=\sum_{j\in原创 2021-11-15 10:41:42 · 185 阅读 · 0 评论 -
P4342:[IOI1998]Polygon(区间dp)
一道警钟一样的好题解析乍一看:“这不就能量项链嘛,这也蓝?”然后就愉快的WA掉了…qwq让我们回归本源,在什么时候可以动态规划?“局部最优解可以带动全局最优解的时候,我们可以使用动态规划算法”然而在本题中,却不满足这个条件!局部的最大值不一定会导致全局的最优!当另一边为负时,局部取最大反而是最差的结果所以应该维护一个最小值,考虑从两方面进行转移以后写类似的题一定要多想一想,不能想当然代码#include<bits/stdc++.h>using namespace.原创 2021-11-12 15:21:23 · 245 阅读 · 0 评论 -
模板:容斥优化多重方案背包
所谓容斥优化多重方案背包,就是利用容斥去优化统计方案的多重背包(逃)前言考场上因为不会这个玩意活活把100分正解挂成了70qwq思想还是很妙的就是先当完全背包做,然后扣去多统计的情况注意扣去的使用k+1个i的方案数是上一层的,因为递归的想,使用超过k+1的方案前面已经扣完了,所以不必再扣代码代码实现很简单(当然,必要时可以使用滚动数组)for(int i=1;i<=mxn;i++){ for(int j=0;j<=sum;j++){ f[i][j]=f[i-1.原创 2021-11-08 16:47:03 · 174 阅读 · 0 评论 -
洛谷P3607:Subsequence Reversal P(区间dp)
解析很巧妙的题我一开始的dp设计其实是可以的只是我误认为它的转移需要n^2然后尝试把它压掉一维结果越跑越远…但一个技巧是只从相邻的状态转移使转移变成O1代码#include<bits/stdc++.h>using namespace std;#define ll long longconst int N=52;const int M=1e6+100;ll read(){ ll x=0,f=1;char c=getchar(); while(!isdigit(c)原创 2021-11-05 11:46:09 · 90 阅读 · 0 评论 -
洛谷P1450:硬币购物(背包、容斥)
解析呜呜呜不废啊我只会跑n遍多重背包感觉非常神仙的一道题之所以只是蓝的可能是因为代码实现难度太低了吧但感觉思想真的很难想到也可能是我太菜了容斥相关还是需要加强啊qwq考虑如果没有硬币个数的限制的情况显然就是个简单的完全背包了然而如今有了硬币个数的限制所以我们要考虑容斥利用总方案数-硬币个数超过限制的方案数求出答案前面的总方案数就是完全背包的dp值,关键就是对后面硬币个数超过限制方案数的求解考虑第iii种硬币超过限制,那么就至少要使用(di+1)(d_i+1)(di+1)个,剩下原创 2021-11-01 23:49:23 · 215 阅读 · 0 评论 -
NOIP2017&洛谷P3953:逛公园(分层图最短路、dp、拓扑)
解析容易想到dp先跑一遍最短路把每个点的dis求出来设计dpu,xdp_{u,x}dpu,x表示结点u多走了x的方案数dp按照dis升序排列后,从前到后转移即可如果有0边,求出只有0边时的拓扑序,作为第二关键字进行排序关于0环,第一篇题解的拓扑似乎是假的…利用dfs和记搜就是真的了但是不想改了代码#include<bits/stdc++.h>using namespace std;#define ll long long#define il inline#defin原创 2021-11-01 11:58:09 · 394 阅读 · 0 评论 -
模板:插头DP
所谓插头dp,就是使用插头的dp(逃)解析好难呀qwq终于算是学明白了吧推荐博客字太多了不想打了自己过去看吧感觉写的非常清晰了代码#include<bits/stdc++.h>using namespace std;#define ll long long#define il inlineconst int N=2e6+100;const int mod=1333331;inline ll read() { ll x=0,f=1; char c=getch.原创 2021-10-29 21:27:55 · 191 阅读 · 2 评论 -
洛谷P5664:Emiya 家今天的饭(容斥、dp)
解析应该是比较入门的容斥了统计方案用总方案数-某列超过1半的方案数dp设计的一个trick是只统计差值代码#include<bits/stdc++.h>using namespace std;#define ll long longconst int N=2050;const double eps=1e-6;const int mod=998244353;inline ll read(){ ll x=0,f=1;char c=getchar(); while原创 2021-10-14 15:07:27 · 150 阅读 · 0 评论 -
洛谷P3155:叶子的染色(树形dp)
解析本题的关键是选取哪一个根对答案没有影响还有一个重要的性质是:根节点必定涂色这点对每棵子树作为独立的子问题时依然成立然鹅我完全没有看到上面那俩性质直接暴力设计dp状态0.、1、2 开始莽然后?然后就T了啊…只好开始考虑换根然后?然后就WA了啊…最后捯饬到第四交才过qwq有一点可贵是忍住了没看LOJ的数据吧看到题不要被它的描述迷惑先想想有啥性质先好好想清楚性质再敲,不要硬用min交给代码莽!(尽管最后莽出来了)代码其实不用换根但是换都换了不贴太可惜了#include<原创 2021-10-13 23:35:05 · 178 阅读 · 0 评论 -
YBTOJ&洛谷P3195:玩具装箱(斜率优化dp)
传送门文章目录前言解析代码前言斜率优化dp,就是利用斜率优化的dp(逃)解析第一道斜优的题分析题目设sum[i]为1-i的c的前缀和容易写出dp转移式:dpi=min(dpj+(sumi−sumj+i−j−1−L)2)dp_i=min(dp_j+(sum_i-sum_j+i-j-1-L)^2)dpi=min(dpj+(sumi−sumj+i−j−1−L)2)但是平方转移会T掉考虑优化设:ai=sumi+ia_i=sum_i+iai=sumi+ibi=sumi+i原创 2021-09-14 16:16:15 · 224 阅读 · 1 评论 -
YBTOJ&洛谷P3750:分手是祝愿(期望dp)
传送门文章目录解析代码解析首先,开关开关两次等于没动,所有对于一个解来说,开关的状态只有开与不开之分接下来的一个关键点是:每一个开关的效果无法被其他开关操作的组合代替所以这个题应该只有唯一解那么我们可以不计代价,只要考虑怎么搞出这个解就行了因为一个开关只能影响因数,所以从大到小考虑遇见亮的灯无脑关就一定可以完成任务既然唯一解,那么这个解就是它了那么我们找出了这个解需要的操作数,记为cnt那么显然的是,cnt<=k时,期望就是cnt接下来考虑cnt>k的情况设计dp:f原创 2021-09-13 14:32:10 · 111 阅读 · 0 评论 -
YBTOJ:彩色圆环
文章目录前言题目描述InputOutputSample InputSample Output解析代码前言尽信书,则不如无书题目描述Input仅有一行,该行给出依次两个正整数N, M,分别表示宝石的个数和宝石在变化时可能变成的颜色种类数。Output应仅有一行,该行给出一个实数E®,表示圆环的“美观程度”的期望值。Sample Input8 1Sample Output8.00000解析期望dp做的太少了,这题整了巨长时间,慢慢来吧qwq设计dp不难,枚举上一个同色块即可,关原创 2021-09-13 00:26:44 · 172 阅读 · 0 评论 -
YBTOJ:魔法数字(数位dp)
文章目录题目描述解析题目描述解析迷惑。。。首先,比较容易想到用二进制状态压缩记录1-9是否在十进制中出现过然后就是整除的问题如果记录余数,它的模数又有9个开九维余数直接爆炸。。。怎么办嘞?有一个结论:若k为p1、p2…pn的公倍数那么(x%k)%pi=x%pi因为k是p的质数,所以这个结论还是挺显然的那么本题就可以找到1-9的最小公倍数(为2520)使它作为模数最后再进行判断即可时间复杂度:18(位数)*512(状态压缩)*2520(取模结果)*10(每次dp枚举)=23原创 2021-07-21 19:48:39 · 388 阅读 · 1 评论 -
P4127 [AHOI2009]同类分布(数位dp)
洛谷传送门文章目录题目描述解析代码题目描述给出两个数a,b求出[a,b]中各位数字之和能整除原数的数的个数。1<=a<=b<=1018解析容易想到数位dp但本题的难点是如果只记录数位和sum与取模的结果res,因为取模的除数发生改变,难以转移如何解决?刚才也提到,本题的难点在于模数发生改变,所以我们就尝试强制使取模的数不变我们发现,因为a、b范围有限,所以这个数位和的范围也是很有限的因此可以枚举数位和分别求解再累加答案问题得到解决代码#include<bi原创 2021-07-21 00:24:54 · 156 阅读 · 0 评论 -
最小代价(区间dp)(ybtoj)
文章目录题目描述解析题目描述解析(我觉得)很难的dp思路是真的没有想出来关键在于dp的设计:dp[l][r]:[l,r]的最小价值f[l][r][a][b]:把l到r之间除了数值在[a,b]之间的数全部消掉需要的最小价值(为了本题要对数列离散化一下,f里的ab存的是数的按大小的编号)关键在于这个f的设计之后后面就好办了,正常转移即可事后诸葛:为什么想到这么设计f呢?因为这么能做出来直观一点的想的话,我们想要转移,关键在于区间的最值所以有此...原创 2021-07-19 20:22:25 · 321 阅读 · 0 评论 -
P1081 [NOIP2012 提高组] 开车旅行(倍增)(动态规划)
洛谷传送门文章目录题目描述解析代码题目描述解析利用倍增,设计dp慢慢敲即可。。。注意距离累加在一起会爆int,需要ll特判条件非常之复杂。。。心力交瘁,就酱了代码#include <bits/stdc++.h>using namespace std;#define ll long longtypedef pair<ll,ll> pr;const int N = 3e5 + 100;int n,m;struct node{ int id,h; boo原创 2021-07-18 16:12:01 · 320 阅读 · 0 评论 -
P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)
文章目录题目描述解析代码洛谷传送门题目描述解析看题目要求很容易想到强连通分量缩点加拓扑dp但是问题在于存图第一感就是和暴力和每个点连边但那样无论点数和边数都很爆炸随后我们发现这个图非常稀疏所以我们可以只连有宝藏的点然而这样边数会被一行横门这样的数据卡成n2怎么办呢?------我的思路到这里就结束了,下面是题解内容---------类似于电话的原理如果新加一台电话就和其他所有电话连线,线会非常多所以就有了转线站,新电话只需要和它相连就行了本题也是类似的思路真正建边的瓶颈在原创 2021-07-16 20:26:33 · 195 阅读 · 0 评论 -
最短路径(状压dp)(ybtoj)
解析“bug总有de完的一天”头疼暴力写的话本题显然复杂度是假的有一个很好的思路优化时间复杂度先用dp[k][i]表示**从第k个关键点到任意i点的最短路跑k遍 SPFA或迪杰斯特拉 即可然后转移时可以只考虑关键点使状态转移数大大降低细节头真疼边界条件:if((st^1<<(id[pl]-1))==0){ return f[id[s]][pl]; }从这里也可以看出也需要预处理一下s的最短路那就加在后面也求一下即可bug!!!1.有向图!!!(惯性.原创 2021-06-24 22:59:26 · 320 阅读 · 0 评论 -
花店橱窗布置(洛谷P1854)(动态规划)
传送门文章目录解析问题代码解析一道很正常的动态规划dp[i][j]表示到第j个花瓶放了第j朵花的dp最优值注意:是严格使第i朵放在j瓶找到最优解递归输出即可问题又是初始化的问题!!!一开始把dp赋值成负无穷时落掉了j=0的一行但到0个花瓶放了i朵花显然也是不合法的(i不等于0时)导致出错以后动态规划一定要重视初始化!!!代码#include<bits/stdc++.h>using namespace std;#define ll long longconst原创 2021-06-19 18:48:10 · 429 阅读 · 0 评论 -
判断整除(opj)(动态规划)
解析与取模结合的动归,正常做即可问题眼瞎!!!这个序列的每个数都必须用到!!!if(f[i-1][j]) f[i][j]=1;上面这行就是不对的!!!头疼仔细审题opj的题你说它水,你倒是切啊qwq 枯了代码(f数组可以用滚动数组优化一下空间复杂度,但就本题数据范围来说不用了)#include<bits/stdc++.h>using namespace std;#define ll long longconst int N=105;int n;int f[.原创 2021-06-15 22:35:18 · 263 阅读 · 3 评论 -
字符串距离(opj )(动态规划)
题目描述2988:计算字符串距离对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:修改一个字符(如把“a”替换为“b”)删除一个字符(如把“traveling”变为“travelng”)比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离。给定任意两个字符串,写出一个算法来计算出他们的距离。输入第一行有一个整数n。表原创 2021-06-15 20:15:44 · 205 阅读 · 0 评论 -
分羊(区间dp:分治与决策单调性优化)
文章目录题目描述样例输入样例输出解析代码题目描述给你一个数列,分成m段,每段的价值为相同数对的对数求最小价值和样例输入10 21 2 1 2 1 2 1 2 1 2样例输出8解析容易想到区间dp定义dp[i][j]:把前i个数分成j段的最小价值那么枚举最后一段断点的位置,转移就是:dp[i][j]=min(dp[i][j],dp[k][j-1]+calc(k+1,i)(1<=k<i)不难发现本题是符合决策单调性的就可以利用这个进行优化啦使用分治思路原创 2021-06-12 15:51:16 · 231 阅读 · 0 评论 -
最大乘积(记忆化搜索)
题目描述给一段数列,用k个乘号分开,求所得最大值n<10!解析这样就不用写高精啦枚举第一个乘号的位置递归记忆化搜索即可问题!一开始边界条件写了一个这个:if(n-st<k) return -2e15;这样使这样的情况强制非法但是这样返回一个极大值再乘上一个大数就会爆ll!其实返回0就行了代码#include<bits/stdc++.h>using namespace std;#define ll long longint n,m;const int原创 2021-06-10 20:30:55 · 85 阅读 · 0 评论