Patrickpwq的DP专练
收集各种DP的题目
Patrickpwq
这个作者很懒,什么都没留下…
展开
-
【CF940E】Cashback(单调队列dp)
传送门Solution:既然是删掉k/c个,那么k<c是不删除的无意义,k=c删除1个,c<=k<2c还是删除1个,那么相当于第c+1个到第k个放在上一区间是无意义的。证明:假如前c个的最小值是mini ,如果a[c+1]<mini,那么删掉的就是a[c+1],不值得,如果a[c+1]>=mini,那么删除的还是mini,把c+...原创 2018-08-11 23:09:00 · 152 阅读 · 0 评论 -
【ZJOI2005】午餐(贪心辅助dp)
容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序。是可以证明无论怎么交换,都没有这样选优的。在这里由于我太菜了,就不写证明了我们设dp[i][j]表示前i个人 在1号窗口打饭总时间为j 最早吃饭完的时间 那也就顺便可以推出在二号窗口的打饭总时间了影响到当前dp[i][j]的:1~i-1最早吃完饭的时间和第i个人打完饭+吃饭的时间 很显...原创 2018-10-23 23:36:00 · 153 阅读 · 0 评论 -
【NOIP模拟 180731 T1】队列(区间DP)
Problem:有 n 个不同的数列成一个队列,现在可以若干次选择两个数交换位置,每个数只能被交换一次。现在 L想知道能得到多少种不同的队列。输入第一行是一个整数 T,表示有 T组数据接下来 T行,每一行是一个整数N表示数量输出T行,每行一个正整数表示这组数据的答案(模1e9+7的值)1<=N<=1000 000,1<=T<...原创 2018-07-30 14:37:00 · 139 阅读 · 0 评论 -
【LUOGU P2015】二叉苹果树(树形DP,二叉树)
传送门这道题是个很好做的二叉树首先考虑给DP数组下定义,一般来说树形DP的DP数组的第一维都是当前节点的编号。这道题光一维肯定是不够的 ,那么加维,发现dp[i][j]表示当前节点为i,保留j个节点的最大苹果数量比较ok。那么方程就显而易见了,dp[i][j]=max(dp[i][j],dp[i.lson][k]+dp[i.rson][j-k-1]+app...原创 2018-07-30 17:06:00 · 203 阅读 · 0 评论 -
【LUOGU P2014】选课(树形DP,多叉树转二叉树)
传送门关于如何把多叉树转化为二叉树,有个口诀,叫做左儿子不变,右儿子兄♂弟。详细的不多说,可以去参考一下相关资料。等转化为二叉树了过后,让我们来琢磨一下。左儿子:原根节点的孩子。右儿子:原根节点的兄 ♂贵 。也就是说,不能直接套用第一题的方程,但是可以对dp数组进行相同的定义。对于一个根节点,都可以,选,或者,不选。当给左儿子分配资源时,根节点必须...原创 2018-07-30 17:10:00 · 182 阅读 · 0 评论 -
【USACO06NOV】Corn Fields(状态压缩dp,预处理行递推)
传送门PS:昨天被dalao深深的鄙视了不会状压dp。。。这几天一定要好好练Solution:我们发现,当前行的状态,只与上一行,以及自身内部有关,因此我们的dp数组很好确定,dp[i][state]代表第i行,状态为state的方案数。ans=sigma(dp[m][state])因此可以递推来dp,枚举每一行,以及所有合法状态。状态转移:上一行所有合...原创 2018-08-01 12:06:00 · 130 阅读 · 0 评论 -
【hdu 4539】郑厂长系列故事——排兵布阵(状态压缩dp,预处理行递推)
j传送门Solution:类似的,我们首先预处理出一行的 只关系是否会自己炸到自己的 所有合法状态(i&(i<<2),i&(i>>2))由于当前行与前两行都有关系 因此我们设dp[i][j][k]为 当前第i行 状态为j i-1行状态为k所以枚举当前行的状态 上一行的状态 上上行的状态 状态转移方程 d[i][s1]...原创 2018-08-02 21:54:00 · 134 阅读 · 0 评论 -
【poj 3311】Hie with the pie(TSP+状态压缩)
传送门每个点最多走一次 因此我们用0,1表示一个点去没去过,这样的话,假如有5个点,10100就可以表示去过第一个点,去过第三个点,其他没有去过。因此状态转移:dp[state][i]=min(dp[state][i],dp[state'][j]+dis[i][j])最短路用floyd搞搞即可,state'里面的第i个城市的状态一定要和第j个一样。ans=min(dp[max_s...原创 2018-08-04 09:55:00 · 124 阅读 · 0 评论 -
【洛谷P1725】琪露诺(单调队列dp)
传送门dp方程很简单啊,dp[i]=max{dp[i-r],dp[i-r+1]...dp[i-l]}+val[i];暴力找最大值只有60分,考虑优化,很明显,用单调队列维护一个滑动窗口即可。起点至少是l,答案的来源最多是n-l。话说单调队列写起来好恶心啊。。。每次都写不对。。。还是要多练看来#include<bits/stdc++.h>#d...原创 2018-08-16 00:24:00 · 194 阅读 · 0 评论 -
【洛谷P1280】尼克的任务(线性dp)
传送门本题要倒着推 即从大的时间往小的时间转移 因为 如果正着 在i的时候 i+t显然还没转移求啥设啥 要求最大的空暇时间 那么设dp[i]为i~n分钟之内可以获得的最大空暇时间方程显然:如果没有任务是从当前时间开始的 则dp[now]=dp[now+1]+1;否则 dp[now]=max{dp[now+time[num]};ans=dp[1]#in...原创 2018-08-16 10:33:00 · 127 阅读 · 0 评论 -
【洛谷P1489】猫狗大战(布尔DP)
传送门很新颖的一个布尔dp,我们用dp[i][j]表示选i个人能否构成j的血量注意,是“能否”,也就是说dp存的是一个逻辑变量。首先考虑一些细节,对于偶数的n,那么两个部队人数肯定是i/2,对于奇数,为i/2(向下取整)和i/2+1考虑如何进行状态转移,dp[i][j]=dp[i][j] | dp[i-1][j-val[k],这个方程挺像背包,所以应该没什...原创 2018-08-17 23:25:00 · 282 阅读 · 0 评论 -
【SCOI2009】windy数(数位dp)
很久以前做的了,今天拿出来重写一下传送门和普通的数位dp一致的采用前缀和思想:用[0,y]的个数-[0,x-1]的个数我们发现windy数是可以从i位推到i+1位的,假设你现在知道了[100,199],[200,299],[300,399]....[900,999]中分别的windy数个数,那对于[1000,1999]来说,只需要判断百位与1的差是否大于等于...原创 2018-09-29 22:43:00 · 167 阅读 · 0 评论 -
【SDOI2009】学校食堂(状压dp)
我擦。。。有毒吧。。好久没调代码调过这么久了。。。 题目的难点就在于每个人打饭的顺序不是一定的 这点特别阻碍思想 注意到一个人的容忍度最多为7 联想到状压 考虑dp数组的定义 首先我们可以把一个人及其后面的7人打没打饭的状态压缩 其次肯定要记录当前到打饭到哪个人了(即1~i-1都打完了饭) 但是似乎少了...原创 2018-10-14 19:46:00 · 132 阅读 · 0 评论 -
【NOIP模拟】T2 管道(状压dp求图的dfs序方案数)
f[i][j]: i表示整个图走没走过的状态 j表示当前到了第j个点 存的值就是在这种情形下 可以走到的地方的状态dp[i][j]:i表示整个图走没走过的状态 j表示当前在j点 访问剩余能去到的点的方案数因此只需要跑一遍DFS就好了#include<bits/stdc++.h>#define int long long#define mod ...原创 2018-10-17 17:53:00 · 228 阅读 · 0 评论 -
【USACO08DEC】在农场万圣节Trick or Treat on the Farm(缩点+记忆化搜索)
其实就是一张图 可知每个点出度为一由于有环 所以把整个图缩点后会好做得多在缩点后 每个强联通分量的出度至多为一。然后我们dfs 直接搜很危险 考虑记忆化 设ans[i]代表第i个强连通分量的答案就好了详见代码// luogu-judger-enable-o2#include<bits/stdc++.h>#define N 100005u...原创 2018-10-17 21:34:00 · 122 阅读 · 0 评论 -
【洛谷P1278】单词游戏(DFS玄学剪枝/状压dp)
解法1 玄学剪枝最暴力的dfs是很好打的 交上去有70考虑如何剪枝1.当一个单词首尾和另外一个单词相同时,优先选择最长的那个,其他的不用选。这一点很好实现,给原数组排个序,dfs的时候写个while特判一下就好2.卡时自杀式剪枝你懂我意思吧以上两个剪枝随便加一个都可以过。。。解法2 状压dpn<=16 应该要先存下所有单词选与不选的情况...原创 2018-10-17 23:09:00 · 207 阅读 · 0 评论 -
【IOI 1999】花店橱窗布置(记忆化搜索)
先打一个最裸的暴力再优化10分代码// luogu-judger-enable-o2#include<bits/stdc++.h>#define N 105using namespace std;int n,m,a[N][N],true_ans,choose[N]; //n束花 m个瓶子 vector <int> q;void dfs(int no...原创 2018-10-18 11:08:00 · 221 阅读 · 4 评论 -
【HDU 1074】Doing Homework(状压+记忆化)
DFS策略:对于当前状态,枚举下一个选哪个(i),如果当前耗时已经超过i的死亡线,ans就累积然后可以记忆化当前状态标记为true 之后扫到这儿就return代码不是A的。。和几份题解都对拍了半天没找出问题 如果能指出错误的话请评论#include<bits/stdc++.h>#define N 17#define INF 0x3f3f3f3...原创 2018-10-18 16:37:00 · 146 阅读 · 0 评论 -
【USACO08NOV】奶牛混合起来 Mixed Up Cows(状压+记忆化)
考虑到当前能否选择这头牛 是与上次选哪头牛有关的 因为要满足差值大于k所以记录一下last 表示选了哪一头牛然后记忆化一下有两个坑点1.注意取绝对值2.要枚举开头的那头牛 决不能直接dfs(0,0,0) 因为第一头牛与0的差值不一定大于k(或者初始化一下a[0]=-INF也阔以)这里提供纯暴力 和 记忆化两份代码暴力#include<bits...原创 2018-10-18 23:08:00 · 147 阅读 · 0 评论 -
【LUOGU P1373】小a和uim之大逃离(递推dp)
传送门QWQdp[i][j][h][l] 表示在点 (i,j),差值为h,小A还是uim取液体的方案数(0:小A 1:uim)转移方程:dp[i][j][h][1]+=(dp[i-1][j][(h-a[i][j]+k)%k][0])dp[i][j][h][1]+=(dp[i][j-1][(h-a[i][j]+k)%k][0]dp[i][j][h][0]+...原创 2018-10-19 21:40:00 · 126 阅读 · 0 评论 -
【NOIP 2007】矩阵取数游戏(区间DP)
一开始思路走偏 一直在想肯定与第几次取数有关 然后做了半天没做出来看了题解才恍然大悟 原来有个性质“可以每行分开来做 最后加起来就好了”那就变成了一个区间DP 我们设dp[i][j]表示从i到j闭区间的最大价值。(只考虑当前行)那么dp[i][j]肯定是从i的右边/j的左边转移来的 则有dp[st][ed] = max( dp[st][ed-1] + num...原创 2018-10-21 11:20:00 · 207 阅读 · 0 评论 -
【LUOGU P1220】关路灯(区间dp)
一开始直接搜索+剪枝,拿了50分,发现原来是搜索搜复杂了..因为搜索是可以过的注意到题目中有一句''再回过头来关掉另一边的路灯,而事实并非如此,因为在关的过程中适当地调头有可能会更省一些",也就是说老王是在沿着某个方向走着走着突然转向,而不是毫无逻辑的,我之前写的搜索枚举就是毫无逻辑的for(int i=1;i<=n;i++) { ...原创 2018-10-21 16:24:00 · 152 阅读 · 0 评论 -
【NOIP 校内模拟】T1 小C的数组(二分+dp)
我们发现直接做dp是不行的 有后效性又发现T是满足单调性的想到二分 考虑check先来想想如何确定一个区间内的数经过修改能否满足limit我们肯定是要把这个区间内的数两两的差改的尽量递增地平均才行写出式子就是(a[j]-a[i])/(j-1)<=limit设dp[i]表示 当前点是i(i不修改) 之后的满足要求的需要修改最小次数然后对于当前i...原创 2018-10-24 16:37:00 · 117 阅读 · 0 评论 -
【ZJOI2006】【BZOJ1003】物流运输(spfa+区间dp)
好题一开始想状压 但是转移根本无从下手设f[i][j]表示i~j天的最低成本 可以想到从第i天到第j天要么不换方案,要么从第k天换一种方案,类似于floyd求最短路就是 f[i][j]=min(f[i][j],f[i][p]+f[p+1][j]+k) 这是个区间dp然后我们发现 对于题目中有些”不可用“的点 只需在跑spfa的时候特判一下就阔以了然后sp...原创 2018-10-25 09:39:00 · 125 阅读 · 0 评论 -
【BZOJ1087】【SCOI2005】互不侵犯(状压dp)
对于这类棋盘问题 要关注的是这一行与前一行的关系设dp[i][j][state]表示前i行,已经放了j个国王,状态为state的方案数然后枚举i,枚举j,再枚举state,再枚举上一行last先判断state,last各自是否合法,再判断他们俩合起来会不会冲突最后答案就是最后一行所有状态的方案数之和我这个写法好像常数巨大啊。。。#include<...原创 2018-10-25 21:26:00 · 139 阅读 · 0 评论 -
【BZOJ2750】【HAOI2012】道路(最短路+拓扑)
容易想到枚举所有起点 做最短路 然后枚举边统计次数一条边(x,y)的贡献 肯定是 s到x最短路的方案数 乘上 s到其他点但经过了y的最短路对于前者每个点可以从前一个点递推过来 只要满足dis[vis]==dis[now]+edge[u].val 当一个点被所有入边都统计了一次后 就可以搜他了(拓扑思想)对于后者每个点从后一个点递推过来#include&...原创 2018-11-01 16:09:00 · 228 阅读 · 0 评论 -
【SDOI2009】Elaxia的路线(拓扑+最短路+dp)
先找出Elaxia的最短路 重新建图 在此图上我们再标记同时也是w**的最短路的边显然这是一个DAG 可以做dp 设f[i]表示以i点结尾的最长公共连续和(公共路径一定是一条链) 则f[vis]=max(f[now],f[now]+e[u].val*e[u].flag)(flag表示是否也是w**的最短路)为了使得没有后效性 需要在拓扑排序时做dp#include<iostr...原创 2018-11-01 20:48:00 · 122 阅读 · 0 评论 -
【NOIP 2017】逛公园(最短路+记忆化搜索)
肯定要先跑一次最短路题目中的k 相当于允许我们走k距离的“冤枉路”回想之前有些题是如何判断哪些边是属于最短路上的 当dis[now]+edge[u].val==dis[vis] 这条边就在最短路上类似的 我们可以得出 dis[now]+edge[u].val-dis[vis]就是这一次走的“冤枉路”的长度到这个地方搜索的策略已经很明显了 dfs(now,remain)表示当前当前...原创 2018-11-02 08:10:00 · 147 阅读 · 0 评论 -
【BZOJ 4247】挂饰(背包变形)
虽然转移方程可以一眼看出但是烦就烦在为何要排序有人说这是一个贪心,又有人说这是一个保障正确性的。就按照贪心的想法好了:在保证正确性的情况下尽量多的挂钩。#include<bits/stdc++.h>#define N 2005#define INF 0x3f3f3f3fusing namespace std;int n,f[N][N];...原创 2018-11-05 22:10:00 · 124 阅读 · 0 评论 -
【ZJOJ2010】数字计数(数位DP)
设f[i][j][p]表示长度为i 最高位为j p出现的个数显然 f[i][j][p]=sigma{f[i-1][k][p]} 其中k是次高位 但是最高位出现的那么多次都没有被我们算进去但是很显然只需要加上(i-2)^10就阔以了然后常规的分[1,b],[1,a-1]解决常规的分成两部分 一部分最高位小于最高位(似乎有点怪怪的??) 另一部分就是剩下的在这里只说下另一部分算...原创 2018-11-06 11:57:00 · 186 阅读 · 0 评论