
胡遭dp
Kalzn
qdu-打不到名额的菜鸡一枚
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
状压dp (CCPC-长春 J - Abstract Painting)
题意:给你一个区间[0,n],和k个圆,圆满足以下几点限制:1、圆上的任意一点的x坐标都在[0,n]之间。2、圆心是位于x轴上的整数。3、半径是1到5的整数。4、圆与圆之间最多1个交点。问:你再往上添加圆,同样满足上述限制,有多少种添法。题解:先说比赛情况,72名银,卧槽,还被73名的铜首老大哥挂知乎了,色色发抖QAQ。老大哥只比我们慢1min。比赛是推出了转移方程,但是没有写写出来,最后20分钟,在我和队友枪键盘中度过,他手里是K题,我手里是这个题。。。最后一个没过。dp[i][j],原创 2020-11-09 19:06:13 · 453 阅读 · 0 评论 -
状压dp(石油大学组队赛 J: Watch Later)
题意:给你一个字串,你每次可以选择一段连续的相同的字符删去,但是你以但选择了一种类型,你就必须把这个类型的所有区间段都删去,才可以考虑选下一种类型。为最少几步可以清空字串。题解:一直在考虑区间dp,后来经队友提醒才知道是状压(快哭了)。然而我不会(快哭了)。然后他们就过了(快哭了)。我们思考状压,二进制该位是1,即为选过这个字符了。然后状压dp模板,这里要知道的是状压dp的主过程就已经是O(2kk)O(2^kk)O(2kk)的了,所以只能O(1)O(1)O(1)转移状态,这里考虑预处理一个表sum[s.原创 2020-09-12 19:49:41 · 285 阅读 · 0 评论 -
数位dp/二分/思维(石油大学G: A-Number and B-Number)
题意:有两种序列A-Number和B-Number。A-Number是所有数位中有7的和被7整除的数。B-Number是A-Number序列除去下标是数位中有7的和被7整除的数。问:第N个B-Number是。题解:这个题只要想明白了,就特别水。我们可以考虑二分结果。然后计算他前面有多少个B-BNumber。如果比N大则缩小,否则增大。那怎么找他是前面有多少个B-Number呢。很简单,我们设F(x)为[0, x]之间A-Number的数量。那么数x之前有ans个B-Number:ans=F(x)−F(.原创 2020-09-06 10:50:06 · 267 阅读 · 0 评论 -
dp/模拟(石油大学组队赛 A Famous Equation / HDU-4249)
题目链接题意:给你一个等式,里面只有一个+号和一个=号,有些数位被隐藏为?号,不允许前导零。问:有有多少种方案让等式成立。题解:一个模拟加+dp,我们记dp[i][2]为三个数考虑到第i位,这一位有没有进1的方案数。按照三个数的情况分类讨论。我们可以对每一位?的最小取值打个标记,即如果?号在一个数的开头,那么它只能最小取1,而不可以取0,否则就可以取到0。因为时间充足,我们可以枚举三个数每一位的取值情况(其实可以O(1)O(1)O(1)进行状态转移)。最后时间复杂度为O(d∗93)O(d*9^3)O原创 2020-09-06 09:46:48 · 221 阅读 · 0 评论 -
计数dp(石油大学组队赛 HDU-4248 A Famous Stone Collector)
题目链接题意:有n中石头,第i种有ai个,随意取石头排成一个序列,问:有多少种非空排列方式。题解:首先一个队都在想生成函数:显然是生成函数的模板题,但是一看模数是1e9+7懵了。队友的MTT当场tle。然后陷入了沉思到比赛结束。比赛后一看题解,很好,dp。然后一看HDU的时限是15s(中石油oj是1s)。队友当场口吐芬芳,在HDU交了一发MTT,遂过。本憨批不会MTT,只得用dp做,QAQ。首先考虑dp[i][j]为考虑前i种石头,序列长度为j的求法。显然是个很水dp,,(上了就想生成函数太伤了)原创 2020-09-05 11:36:12 · 240 阅读 · 0 评论 -
树形dp(HDU-6820 Tree)
题目连接题意:给一颗带边权的树,你要求一个最大权联通快,要求里面超过k度的节点只能有一个。题解:这个题解不是官方思路。而是一位大佬的思路。首先,我们dp[i][2]表示第i个节点为根的子树。有没有与fa向连的最大权值。我们不妨先考虑,没有大于k度的节点,然后再对于每一个节点,令它的度数大于k,从而求出最大权。显然对于dp[i][0],他最多可以连接k个孩子,对于dp[i][1],他最多可以连接k-1个孩子。我们首先要择优选取。我们首先递归孩子,得出孩子节点的最大权值,再以(孩子的最大权值+这条边的原创 2020-09-04 14:57:48 · 264 阅读 · 0 评论 -
dp/思维(ACMICPC EC-Finals 2015 F-Hungry Game of Ants)
题目链接题意:一个长为n+1的杆子。上面有n个蚂蚁,第i个蚂蚁在距离左边第i个位置,重量为i。开始后,所有蚂蚁随机从向左或者向右以相同的速度开始移动,如果走到杆子的头,他会立刻掉头。如果两个蚂蚁相遇了,则重量大的那个蚂蚁会把小的吃了,他的体重会增加小的体重。并继续往前走,如果两个蚂蚁重量相同,则左边会吃掉右边。问:第k个蚂蚁有多少种幸存到最后的情况。题解:首先,如果第k个蚂蚁开始往右走必死无疑。只能向左走,不难想到此时k蚂蚁只有把先k-1只蚂蚁全部吃掉之后才会和他右边的蚂蚁相遇。也就是说,在和开始右边原创 2020-09-04 14:56:49 · 653 阅读 · 1 评论 -
dp/贪心 (中石油组队赛-JTiling Terrace)
题意:给你一个只包含".“和”#"的序列,你需要覆盖这个序列,有三种覆盖方式:覆盖 “.” 价值为G1覆盖"..“价值为G2覆盖”.#."价值为G3每个点只能被覆盖一遍,但是不必覆盖所有的点,第一中覆盖方式最多只能有K个。为最大化覆盖价值和。最多50个”#“号显然是个dp,dp[i][j][2]为到达第i个井号,用了j个第一覆盖,最后一个井号有没有被覆盖。pos[i]为第i个井号的位置转移方程为:sum=pos[i]−pos[i−1]−1sum = pos[i]-pos[i-1]-1sum.原创 2020-08-31 11:46:10 · 319 阅读 · 0 评论 -
1D/1D的动态规划/单调队列优化
我仅一届平凡人对于某些dp的状态转移方程,我们可以写成一种形式:F[i]=minl(i)≤j≤r(i){F[j]+val(i,j)}F[i] = \min_{l(i)\leq j \leq r(i)} \{F[j] + val(i, j)\}F[i]=minl(i)≤j≤r(i){F[j]+val(i,j)}在这种模型中,j取值的范围都是关于i的一次单调函数val(i,j)val(i, ...原创 2019-09-05 22:15:35 · 729 阅读 · 0 评论 -
数位dp(洛谷 P4124 [CQOI2016]手机号码)
题目链接普通数位dp,不过有几点值得深思。首先,我们每个手机号的位数固定为11位,即,不满足11位的并不是手机号不满足条件。而且如果像普通数位dp那样求该数到0之间的数量的话,还要考虑前导0的印象。(多开一维数组存前导0)不太值得。所以,我们直接求该数到1e10之间的数: int mx = flag?su[cur]:9; int bon = (cur==len-1)?1:0;...原创 2019-08-17 21:58:34 · 823 阅读 · 0 评论 -
数位dp(洛谷 P3413 SAC#1 - 萌数)
题目链接这个题,只要有回文串就行了,其最低要求:当前位数数字与上一位或上上一位相同。我们设:dp[i][pre1][pre2][k][gg],为前i位数,最后一个数字为pre2,倒数第二个数字为pre1。已经有匹配回文串(k == 1)或还没匹配到回文串(k == 0)的个数。其中gg为当前数字去掉前导0后的位数。(全部为0时gg ==0,有一位数gg == 1, 大于一位 gg =...原创 2019-08-17 10:31:55 · 303 阅读 · 0 评论 -
状压dp(洛谷 P1283 平板涂色)
题目链接思考了一会,发现是状压dp,注意的是每个矩形(除了最上面的)都有自己的先导状态。我们必须记录。这里我用pre[i]记录。即如果想填色第i块。必须达到的状态。详细记录过程看代码。比较好懂。//mp[i][j]意思是(i,j)坐标位置,被那个编号的矩形占用了(-1为空) for (int i = 0; i < n; i++) { for (int j ...原创 2019-08-16 11:08:40 · 316 阅读 · 0 评论 -
dp(CodeForces - 1114D Flood Fill )
题目链接普通dp,可是看错题了。导致想不出来。题目意思是固定起点,即,在一个点进行操作。不停操作其所属的区间段。直至全部颜色相同。下面是ac代码:#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>...原创 2019-08-15 21:40:14 · 203 阅读 · 0 评论 -
状压dp/bfs建图(HDU 4856 Tunnels)
题目链接不难的一道题。就是把状压dp和bfs结合一下。。。先每个隧道的终点搜一遍全图存入eg。然后状压dp模板。下面是ac代码:#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#includ...原创 2019-08-15 21:36:16 · 211 阅读 · 0 评论 -
树形dp/结果实时记录(codeforces 1083 A The Fair Nut and the Best Path )
题目链接网上好多大佬题解什么基础树形、入门树形。大都没有详细讲述转移方程。在这说一下。对于一个子树:dp[i]记录的是从i为根节点的子树,从i出发到达该子树中某一节点的最大距离。特别注意:是从i出发。这样的话我们就考虑了该子树中所有从i出发的情况。但是这事易知一种情况被忽略了:从一个子树的某个点到另一个子树的某个点。对于这种情况,我们采用实时用ans记录的方法。我们结合代码注释理解一...原创 2019-08-11 14:07:53 · 165 阅读 · 0 评论 -
背包dp(upc组队赛 PACKING)
PACKING时间限制: 1 Sec 内存限制: 128 MB题目描述It was bound to happen. Modernisation has reached the North Pole. Faced with escalating costs for feeding Santa Claus and the reindeer, and serious difficulti...原创 2019-08-14 21:51:32 · 220 阅读 · 0 评论 -
状压dp(HDU - 3538 A sample Hamilton path )
这是个状压dp???要不是它出现在了状压dp的题集里。。。我。。。。dp[i][j] 在i状态下,最后一个点到达j的最小值。后按正常状压dp的转移过程。下面是ac代码:#include <iostream>#include <cstring>#include <string>#include <algorithm>#include...原创 2019-08-14 21:24:15 · 163 阅读 · 0 评论 -
uva624-CD (01背包的路径记录)
uva624-CD (01背包的路径记录)关于背包的路径记录,我一直有疑问,现在在大佬博客中看到了比较好的代码;题目很简单,难点就是在记录路径上。首先我们使用最朴素的方式求出最优解,然后开始处理路径问题。我们可以将这个处理方式看作背包的逆过程(将物品一件一件地拿出来)对于一个物品, 若dp[ i ][ c ] != dp[ i - 1 ][ c ]则我们可以认定第i号物品被使用了,上...原创 2019-05-09 20:53:17 · 205 阅读 · 0 评论 -
博弈背景下的dp与记忆化搜索 (两个例题 LightOJ - 1031 Easy Game HDU - 4597 Play Game)
对于某些dp,是在博弈的基础上的,针对这些题目,我们不妨设dp[某一阶段],为该阶段先手的最优子结构那么对于他的状态转移:dp[下一状态] = max(忽视对手的最优情况 - dp[上一状态])尝试理解:因为博弈中,一个状态的先手,在上一状态是后手,而对手是先手,所以dp[上一状态]其实是对手的最优状态,所以有在忽视对手的最优情况 - 上一状态对手的最优情况。比较抽象,下面看两个...原创 2019-07-26 10:23:40 · 311 阅读 · 0 评论 -
三态背包 (Hurdles of 110m ZOJ - 2972)
题目链接对于普通的01背包,我们知道,物品只有0和1两种状态,即取或者不取,费用分别是w和0,价值是v和0,而对于这个题来讲,我们把每一段当成一个物品,这样每个物品有3中状态,价值分别为t1,t2,t3。费用本别为 f1,0,f2。背包容量为选手的最大体力值。这样转移方程为:dp[i+1][j] = min(dp[i+1][j], dp[i][j] + t2[i]);if (j >=...原创 2019-07-26 10:40:42 · 152 阅读 · 0 评论 -
背包/树形dp (zoj 3201 Tree of Tree)
题目链接借此题了解树形dp思想对于这个题目又称有树形依赖的背包问题,对于每个节点的抉择就是将其子节点看成几类,从这几类中选出<=最大体积的物品,实质是分组背包。因对于每一个物品,只有先选择了父节点,才可以被选中。所以有是一种树形结构。下面是ac代码:#include <iostream>#include <cstring>#include <stri...原创 2019-07-22 20:51:54 · 137 阅读 · 0 评论 -
dp/字符串hash (Phalanx HDU - 2859)
题目链接对于这个题目,学习字符串hash技术。首先一般用131进制数打hash表。我们可以再O(n)打出hash表,还可以O(logn)查询最长公共先/后缀。对于每一个区间[l,r]的子串,其hash值是f[r] - f[l-1] * 131^r - l + 1说起来抽象,但是实际上比较简单,直接上代码吧下面是ac代码:#include <iostream>#inc...原创 2019-07-26 20:54:35 · 214 阅读 · 1 评论 -
计数dp (codefroces 1067D Array Without Local Maximums)
题目链接石油大比赛时交给另一个队友a的,他a出来就没在管了(tpl),现在补一补。这个题不卡内存就是了。三维dpdp[i][j][k] 意思是考虑前i位,第i位小于等于j的方案数(k==0时指第i-1位等于第i位,k == 1时为>, k == 2为<)易知状态转移方程,这就不单独列举。直接看代码吧。ps.1.不卡内存!尽管开,不用滚动(用了当然更好),要用long ...原创 2019-08-07 22:26:54 · 173 阅读 · 0 评论 -
状压dp(FZU - 2218 Simple String Problem)
对于这道题,我们设:dp[i],为状态i及其子状态中最长的字符串下面是ac代码:#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#include <cstdlib>#include...原创 2019-08-14 20:54:06 · 156 阅读 · 0 评论 -
数位dp/三进制状压(SPOJ BALNUM Balanced Numbers )
对于这道题,我们设一位数有三个状态,0:该位是前导零1::该位是奇数2:该位是偶数最终仿照状压dp将状态压缩进dp数组二维。dp[i][k] 前i位数字,状态为k的个数。下面是ac代码:#include <iostream>#include <cstdio>#include <cstring>#include <algorith...原创 2019-08-14 20:58:34 · 262 阅读 · 0 评论 -
树链剖分前导知识(HDU-5242 Game)
这个题其实用树链剖分知识可以完美解决,(但是大材小用),我们可以贪心出最优解。首先我们可以求出每个节点到根节点的距离。最后按照这个递减顺序开始带标记的在跑一遍图。这样保证每个节点只走过一次,路径还是最大的。下面是ac代码:#include <iostream>#include <cstdio>#include <algorithm>#include ...原创 2019-08-14 21:04:52 · 138 阅读 · 0 评论 -
树状dp(POJ 4045 Power Station )
对于这个题,我们第一次dfs跑出dp1[i]——以i为电站其子节点构成的子树的总长度。第二次dfs跑出dp2[i] ——以i为电站其包括父节点的子树的总长度。典型树状dp,不赘述。#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#includ...原创 2019-08-14 21:09:11 · 156 阅读 · 0 评论 -
状压dp(POJ - 1185 炮兵阵地 )
种菜的那个题的升级版,不过比较简单。搞清楚三个判断函数就好了:che() 判断本行状态是否符合(一行中炮兵相隔最小为2)chc() 判断这特定的一行是不是符合(只能放在P上)chzh()判断两行是否冲突。下面是ac代码:#include <iostream>#include <cstring>#include <string>#include...原创 2019-08-14 21:14:31 · 131 阅读 · 0 评论 -
树状dp/枚举(CodeForces - 500D New Year Santa Network)
我们尝试枚举,若把3个点不同排列也算入,发现每个边都被计算了左子树点数 * 右子树点数于是树形dp跑一边,每次更改一条边从新计算和就行了(别忘了除C(n,3))下面是ac代码:#include <iostream>#include <cstring>#include <string>#include <algorithm>#inc...原创 2019-08-14 21:20:39 · 237 阅读 · 0 评论 -
dp/滚动数组-666RPG
dp/滚动数组-666RPG题目链接对dp的几个要素还是理解不透彻!这个dp其实是比较简单的,但是正是因为自己对状态转移理解的问题,做不动。。我们定义dp[ i ][ j ]为考虑前i个数时,分数为j的方案数。易得:dp[ 0 ][ 0 ] = 1;dp[ i ][ j ] = dp[ i - 1 ][ -j ]+dp[ i - 1 ][ j - a[ i ] ];要注意的是...原创 2019-05-09 20:22:47 · 393 阅读 · 0 评论