![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
拔光祖国小草
存放一下做的题。
展开
-
状态压缩dp学习 + poj3254(最简单的状态压缩dp)
初学状压就找个比较简单的dp,应该是最好想的状态压缩了。状态压缩dp也就是如果正常开数组,必然会导致内存过大,所有需要另外找一种办法来代替这个问题,那么就用二进制来替代,这应该就是对于状态压缩最通俗的解释了。关于一些二进制的操作比如1 如何判断数字x第i位是否为1 12 将一个数字x二进制下第i位更改成1 x= x|(13 把一个数字二进制下最靠右的第一个1去掉原创 2017-06-28 16:21:19 · 626 阅读 · 0 评论 -
UVA1336(区间dp)
区间dp给我的印象一直是O(n3)的 做到这题才发现自己理解的偏差 题解参考:原作者#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <cstdio>#include <string>#in...原创 2018-03-04 19:13:42 · 177 阅读 · 0 评论 -
codeforces 940E(单调队列+dp)
题意:给你n个数字,要求将连续的数字划分成x组,每组的和为Sumi,每组长度即数字个数为Li,但每组前 Li/c(向下取整)小的数不计入总和,求最小的和 ∑sumi 明显的dp,dp[i]表示前i个数取最优分组的结果 最容易想到的是n2的,也必然是TLE的解法(因为n是1e5) dp[i] = min(dp[j] + sum[i]-sum[j] - sum(Minsum((i-j)/c...原创 2018-02-25 21:49:46 · 728 阅读 · 0 评论 -
codeforces 908E(概率dp)
题意:初始一个空串,有Pa/Pa+Pb的概率在后加a,有Pb/Pa+Pb的概率在后加b,问最后的期望的ab子串个数(ab可以不连续)我是个概率dp弱智,该题证明出自这位句句 所以我补的解法就是他的解法了 希望有朝一日我也能这么强啊#include <iostream>#include <algorithm>#include <queue>...原创 2018-02-25 23:15:55 · 267 阅读 · 0 评论 -
HDU 4734 (数位dp)
又重新学习了一遍数位dp,真的不太熟练 一个是对这个记忆化不太理解 后来看到就是说 假如现在搜3xxx,之前1xxx往后搜的时候3xxx已经搜过了,所以直接可以返回 dp[i][j]表示搜索到第i位总和不超过j的个数 所以最后求的就是dp[pos(b)][f(a)]#include <iostream>#include <algorithm>#inclu...原创 2018-03-22 21:33:04 · 157 阅读 · 0 评论 -
UVA10617 (区间dp)
题意:一个串删除一些字母使得剩下的串是回文串,问有多少种方法 题解:直觉就是区间dp吧,状态也肯定是dp[i][j]表示i−j有多少个回文串dp[i][j]表示i−j有多少个回文串dp[i][j] 表示 i-j有多少个回文串 状态转移真的不好想啊= = **枚举删除s[i] 和 s[j] dp[i][j]=dp[i+1][j]+dp[i][j−1]−dp[i+1][j−1]dp[i][j]...原创 2018-03-26 23:33:33 · 182 阅读 · 0 评论 -
codeforces 632E (完全背包)
题意:给你n个物品的重量,问取k个能获得多少种不同的重量感觉是一个dp的套路,乍一看像是个多重背包,但是没法同时维护多个值,所以将所有重量减去最轻的,那么最轻的就变成0了,转而变成一个完全背包 dp[i]表示重量为i的情况下所需要的最小个数,如果该个数小于k的话,就可以用最轻的那个补上#include <iostream>#include <algorit...原创 2018-04-17 00:21:18 · 270 阅读 · 0 评论 -
codeforces 645E (贪心+dp)
对于求子串个数明显是用dp,对于每添加一个字符ch,必然是多2*dp[i-1]个串,那必然还有重复的串,就是之前ch出现位置的串,需要减去。 对于添加字母,贪心的加上之前出现位置最小的字母。#include <iostream>#include <algorithm>#include <queue>#include <stack>#...原创 2018-04-18 22:55:40 · 176 阅读 · 0 评论 -
Codeforces 660E (dp || 组合数学)
dp[i][j]dp[i][j]dp[i][j]表示长度为iii,以字符jjj结尾的答案是多少 对于普通的来说,一个经典的转移方程 dp[i][j]=∑mk=0(dp[i−1][k]∗2−dp[pre[j]−1][k])dp[i][j]=∑k=0m(dp[i−1][k]∗2−dp[pre[j]−1][k])dp[i][j]=\sum_{k=0}^m(dp[i-1][k]*2-dp[pre[j]...原创 2018-04-19 21:50:31 · 224 阅读 · 0 评论 -
Uva11468(AC自动机+概率dp)
坑死我了,其实我还是不太懂为什么一定要补上不存在的边? 但是这题的妙处就是可以由fail跑出所有的后缀来#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <cstdio>#include <string>...原创 2018-03-15 21:17:23 · 250 阅读 · 0 评论 -
uva6625(状压dp)
题意:有k行,接下来是每行有几个格子,再输入一个上限n,需要满足规则填数字。 规则1:每行右边的数大于等于左边 规则2:每列下面的数大于上面 规则3:填入的最大数字不超过n,不小于1题解:注意到n只有7,又是递推(因为前面填入的数字会影响后面)可以联想到状压dp,因为每列的数字互不影响,我们把每列的状态压缩。预处理出每一列的状态,与上一列比较是否合法 dp[i][j]表示第i列第j...原创 2018-02-15 16:05:58 · 107 阅读 · 0 评论 -
CodeForces - 404D -Minesweeper 1D ( dp )
明显自己的思维太狭隘了,方向是没有错,想着会有炸弹在1前和炸弹在1后,居然自己就没有办法处理了,其实很简单啊,,就把这两种情况分出来就行了啊- - 真是太蠢了dp[maxn][5],当前的状态由之前5种状态决定,分别是 0、 炸弹+1,没有炸弹+1,2,炸弹。然后需要注意的是当前的1放下去可能会形成 炸弹+1 和没有炸弹+1,所以不要搞混。然后就是这道题需要mod,WA了半天,最原创 2017-07-01 14:45:55 · 212 阅读 · 0 评论 -
HDU4055 (dp计数)
场上做不出难题见太少了。。真的是佩服这些人的脑洞啊。我一定要记录下这两题,以后也可以看看,开了我的脑洞。#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define I原创 2017-07-09 21:41:10 · 324 阅读 · 0 评论 -
HDU5113 (dp+枚举)
真的好菜啊= =这种dp都不会。 因为和只有1e6,所以就枚举所有能得到的和, dp[i][j]表示前i个数能达到j这个值所有的种类。#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <cstdio>#include <cmath>#include <map>#inc原创 2017-09-20 08:26:29 · 593 阅读 · 0 评论 -
codeforces #436 - E. Fire (记录路径dp)
有一些东西,抢救的时间为t,时间到达d会消失,价值为p, 问在最后一个东西销毁之前所能抢救的最大物品价值是多少,并输出抢救的个数及序号。题解:dp[n]表示前n秒内所能抢救物品的最大价值。 排序枚举时间 其实我记录这题的价值在于如何记录路径,学习一下,应该是可以通用的吧#include <iostream>#include <cstring>#include <string>#inclu原创 2017-10-10 22:09:07 · 192 阅读 · 0 评论 -
BZOJ 3747(递推dp)
题意:构建一个由G、R、P三个字母构成的字符串,要求出现G则必须要大于等于连续M个,出现R则必须要小于等于连续K个脑子太笨了,不会转化,一开始无从下手,对至少M个无法处理,想着可以从之前i-m之前都转移过来。还是看了题解。将原题转化为(至多n个G,至多k个R) - (至多m-1个G,至多k个R)。真他妈巧妙啊= =。dp[i][0] 第i个为G,至多有u个G 和v个R的个数原创 2018-01-27 16:40:10 · 213 阅读 · 0 评论 -
牛客网-常州大学新生寒假训练会试 D-训练技巧(单调队列+dp)
题目戳这里emmm不太会啊,没学过单调队列优化的dp,我只会O(n2)的,(哭到现在我也其实不太能理解,感觉要消化很久dp[i]表示不取i,并且取法合法的最小消耗 dp[i]=min{dp[j]+a[i]},其中 i-j<=k 单调队列维护一个最小值,保证需要取法不合法的时候出去的一定是一个最小值 那么ans = min(ans, sum - dp[i]), i...原创 2018-02-09 13:07:27 · 243 阅读 · 0 评论 -
codeforces 918D(组合游戏+记忆化搜索)
题意:在给定的一个有向无环图上,两个人分别从一个点出发,两人轮流从当前点沿某条边移动,要求经过的边的权值不小于上一轮对方经过的权值直到某一方不能移动。求一个n*n的胜负表可能是我没学过组合游戏的关系?当时dfs不知道怎么转移 题解: dp[x][y][c],表示先手在x,后手在y,上一次经过边权为c的胜负状态(1胜0负),此时从x往后走,假设从x->u,边权为v,要求v>=...原创 2018-02-13 21:16:35 · 275 阅读 · 0 评论 -
codeforces 602 E. Kleofáš and the n-thlon (概率dp)
题意:有nnn个人进行了mmm场比赛,告诉你了自己的每场排名,并且一场比赛中不会有并列,问最后自己的期望排名 题解:很明显期望dpdpdp,dp[i][j]表示进行了i场比赛得分为j的期望人数dp[i][j]表示进行了i场比赛得分为j的期望人数dp[i][j]表示进行了i场比赛得分为j的期望人数那么转移就是dp[i][j]=(∑j−1k=j−mdp[i][k]−dp[i][j−a[i]])/(m...原创 2018-05-03 07:45:08 · 201 阅读 · 0 评论