
DP
文章平均质量分 83
qkoqhh
这个作者很懒,什么都没留下…
展开
-
XDOJ 1233
一道假LCS。。。原LCS做法,给数组a,b,d[i][j]为以a[i],b[j]为结尾构成的子列的lcsd[i][j]=max{max{d[i-1][k](k=1-j)}+a[i]==b[j]}因为是1-n的排列所以每个数的位置都可以提前确定哪个位置的b[j]==a[i],但由于要维护前缀和所以想到了树状数组(好吧其实是线段树qaq)。。。不过总感觉对单点进行一次标记就用线段树有点大...原创 2017-09-30 16:27:05 · 376 阅读 · 0 评论 -
XDOJ 1229
emmmmm今天程序猿洁怎么说也得码点东西吧。。。码什么好呢?。。要不做一下集训题中的水题吧。。然后发现一点也不水,还是太弱了QAQ要删去字符串中的字符使它成为回文串??emmm不要删啦,选个最长的吧。。想到二分然而发现并不可行。。。不过回文肯定只看一半就行。那。。要不从2边到中间搜?状态发现下标是左右2边有点乱。。所以把右边的记录在数组中了。。设f[i][j]将s[j]选为第原创 2017-10-24 22:50:19 · 458 阅读 · 0 评论 -
poj 2923
本想做点简单点的DP练练手。。然后一不小心选到了状压DP。。。然后发现自己的DP真是弱的一比。。。把几份物体被2车载一次的所有方案暴力出来,记录体积,然后就像01背包一样转移即可。。#include#include#include#include#include#define inc(i,l,r) for(int i=l;i<=r;i++)#define dec(i,l,r)原创 2017-11-28 19:05:35 · 180 阅读 · 0 评论 -
poj 1160(四边形不等式)
其实早就想练DP了,毕竟自己的DP都是XJB乱写的。。然后不小心看到四边形不等式就钻进来瞧瞧。。这题好像初中就做过,才发现竟然是IOI的题?!考虑到邮局并没有先后顺序,所以从左往右依次设置邮局,然后得到转移方程如下:设d[i][j]为使用i个邮局负责前j个村庄的最小费用,w[i][j]为在i到j村庄中设置一个邮局的费用d[i][j]=min{d[i-1][k]+w[k+1][j]}原创 2017-12-23 15:35:41 · 360 阅读 · 0 评论 -
cf914C(数位DP)
有点感动..竟然当场独立做出了数位DP..感觉假期这个或许可以练得起来?看到要直接统计各数的变换次数绝对是不现实的..可是如果手动先变换一次的话就变成1000以内了,这样就可以在统计变换次数的基础上+1就可以了..那么剩下的就是把符合题目的次数的数给挑出来了,其实很明显变换次数和1的个数有关,所以有必要把1个数的相同的归类,所以并没有什么特别正式的转移方程,处理1个数统计对各位数扫一遍原创 2018-01-22 12:15:11 · 357 阅读 · 0 评论 -
poj3254(状压DP)
状压DP虽然以前是学过了。。不过也忘得差不多了吧。。主要考察对位运算的灵活运用,然而这是需要积累的。。另外。。状压DP不是很好debug,往往打出表来也是一脸懵逼的。。判断行与行之间是否有相邻直接与,列与列之间是否有相邻需要x&(x其他就直接转移。。#include#include#include#include#include#include#defi原创 2018-01-25 17:11:21 · 162 阅读 · 0 评论 -
poj3311(flyod+状压DP)
这类问题貌似叫TSP问题。。然后这个好像还是NP问题。。(算了到现在都不造NP问题是什么。。qaq)先来个flyod算出最短路(好久没写过最短路了耶。。),然后直接记录经过了哪些点,直接二进制压缩就行。。由于还要在折返回去,所以要记录当前状态最后一个点在哪,在经过所有点的基础上返回1点。。。转移的话顺推会比较快一点。。。#include#include#includ原创 2018-01-25 18:07:01 · 468 阅读 · 0 评论 -
hdu4539(状压DP)
这个做法感觉比较危险啊。。不过最终竟然才用100+ms也是神奇。。。将每行的状态压缩二进制数,然后筛出点点之间不冲突的状态,总共不超过170。。。然后因为前2行的状态都会影响到当前状态的选择。。由于dp的影响无后续性所以我们必须将这2行一块处理了所以d[i][j][k]表示第i行时,i行状态为j,i-1行状态为k时的最大兵数然后直接把符合状态的再加上j的1个数就行。。这个还能预原创 2018-01-26 18:41:10 · 252 阅读 · 0 评论 -
noip2015D2T2(DP)
记得当年就是被这题坑得不浅吧。。现在回过头来做还是不会TAT主要是自己老是想一个一个子串加上去。。事实上一个一个字符加上去问题就简单多了。。设d[i][j][k]为扫了A的前i个字符和去了第i个字符,B的前j个字符和取了第j个字符,然后用了k段的方案然后得出方程然后复杂度为O(nm^2k)然而求和那块如果用前缀和代替可以降成O(nmk)然后考虑到内存可以会爆可以使用原创 2018-01-27 12:20:55 · 205 阅读 · 0 评论 -
hdu2089(数位DP)
开始填数位DP大坑。。(鉴于数位DP对数学的要求并不高。。看了一下原来数位DP是要用记忆化搜索写比较方便。。。原因是容易传递是否到达上界和下界。。不过下界一般不用判断,毕竟我们还可以差分嘛。。。这题的方程十分明显了d[i][j]=sum(d[i-1][k])当且仅当j!=4&&!(j==6&&k==2)然后数位DP的主要难点还是在转移这块吧。。多练练应该就会了。。#原创 2018-01-28 22:11:14 · 142 阅读 · 0 评论 -
hdu3652(数位DP)
这道比较繁琐。。除了处理13之外还得处理整除,这样就无法用排除的方式筛选了。。方程大概是这样的。。d[i][j][k][v]为扫到i位,末位为j,余数为v(假设后面全为0),k代表前面是否找到13然后转移按照题目要求转移,这对记忆化搜索来说不难。。方程维数增多对想出方程和实现过程都带来了一定难度。。所以还是得适应高维的方程才行。。然后需要注意的是满足题目要求的并不多。。即d里面有很原创 2018-01-29 14:25:54 · 244 阅读 · 0 评论 -
hdu3709(数位DP)
debug了好久发现是数组开太小了!!!(砸这样弄。。枚举平衡点位置然后直接数位DP即可,把比平衡点高位记为正,低位记为负,这样只要令最后结果为0即可然后需要证明一下平衡数的平衡点是唯一的。。(其实是一开始忘了这种情况。。对任意平衡数,以平衡点左移为例,左边的数的权重会变小(除非本身为0),右边的数的权重会变大(除非本身为0)由于对正数来说,左边的数的权重是不可能为0的。。所以原创 2018-01-29 16:53:44 · 162 阅读 · 0 评论 -
LightOJ1140(数位DP)
所以。。。大家说的LOJ到底是LightOJ还是LibreOJ?= =!终于有道比较清爽的数位DP题了。。虽然写得依旧很慢就是。。qaq统计0的个数。。。这个需要稍微分一下是不是前导0,标记一下前面有没有非0数即可,然后。。就是在统计数的个数时太想当然了。。以为是10^n什么的。。计算上界的时候可不是这样的耶。。所以要边转移边统计。。用cin的原因是。。。用%llu输入时编译器不造原创 2018-01-29 18:13:23 · 293 阅读 · 0 评论 -
LightOJ1032(数位DP)
这个还是非常好统计的。。统计好首位为1的数的个数就没啥了。。不过这个oj的数据还真是良心。。基本过了样例就可以A了。。。#include#include#include#include#include#include#define inc(i,l,r) for(int i=l;i<=r;i++)#define dec(i,l,r) for(int i=原创 2018-01-29 19:04:10 · 246 阅读 · 0 评论 -
cf55D(数位DP+离散化+各种优化)
这个题比较不好弄。。首先要维护搜到当前的lcm,以及处理余数问题。。余数这个取谁的余比较好呢。。这个需要取1-9的lcm比较好,利用公倍数的性质,将余数状态强压到2520以内然后复杂度就变成了20*2520*2520了。。。还是会爆。。然后再来个离散化把1-9所有公倍数组合提取出来。。其实就是2520的因子。。实测有48个。。然后复杂度又降成了20*2520*48。。在记忆化搜原创 2018-01-31 16:13:53 · 648 阅读 · 0 评论 -
poj3252(数位DP)
继续数位DP吧。。这几天tm全在颓。。这个和上次cf题应该是一样的。。由于只有01,这个数位DP就比较好写,而且方案也可以用过组合数求出来,也是降低了一些难度,所以上次直接转移就比较成功了。。组合数这个思路还是比较好的。。http://blog.youkuaiyun.com/qkoqhh/article/details/79127495这次就补上个正统的解法。。#inc原创 2018-02-03 21:07:28 · 234 阅读 · 0 评论 -
LightOJ1068(数位DP)
发现数位DP其实并不难调。。只要有数据的话。。。(当然考场需要对拍。。这个要维护2个余数,然后就是按照数位该有的模式转移即可,不过k的范围非常大,貌似会爆内存。。以前做数位dp其实根本就没想到会到内存不够用的地步丫。。仔细想想会发现,数位和最多也才82(1999999999的情况),所以k>82直接输出0就可以了,然后这样内存还是非常充裕的。。#include#inclu原创 2018-02-03 22:22:30 · 224 阅读 · 0 评论 -
牛客某题(DP+线段树)
都不造怎么用简短的语言表述题目来源了。。直接给传送门把。。 (结尾处这个很容易能够得出dp方程的。。 d[i][j]={d[i−1][j−1]max{d[i][k]} k=1∼ n j>0 j==0然而复杂度为o(n^2),还是会爆时间和空间的。。 对空间非常容易想到用滚动数组。。 照这个思路顺下去会发现,如果不考虑j==0的情况,d[i]是d[i-1]平移之后做了原创 2018-02-07 15:57:35 · 402 阅读 · 0 评论 -
yandex资格赛C(dp->快速幂)
这场的bc都不太容易切啊 。。b的话还是考逻辑想象。。思维度没有。。然后这个c还是蛮有意思。。考虑一维情况很容易想到dp方程设扫到第i个数前缀和余数为j的方案为d[i][j]d[i][j]=sum(d[i-1][k]) k=0-n-1 =n*d[i-1][j]因为对上个余数k肯定能在1-n找到数使余数为 j。。所以余数为几基本都一样。。可以简化为:d[原创 2018-02-19 00:48:32 · 1137 阅读 · 0 评论 -
poj3744(概率dp+矩阵快速幂)
这题概率dp入门。。。怎么连入个门都要被卡qaq明显 dp方程为d[i]=p*d[i-1]+(1-p)d[i-2] 由于i很大。。所以直接转移会tle。。。所以用矩阵乘法优化就行了。。/** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ *原创 2018-02-20 11:31:05 · 285 阅读 · 0 评论 -
cf935d(概率dp+逆元)
这个dp倒是不难。。也算不上dp吧。。就是概率直接推而已。。主要处理0的问题,分成大于和等于,把大于先算出来,等于留和给下一位乘上来。。然后为什么要反过来算呢。 。就是比较方便算吧。。其实正着也没什么问题。。。然后这个问的价值主要还是在他问的方式,就是把这个答案保留分数还取膜了,当然小数是不可能取膜的。。所以要把除法转变为乘法。。即把p/q (mod inf)变成p*q^(-1)m原创 2018-02-21 22:23:05 · 496 阅读 · 0 评论 -
cf935e(树形dp)
树型dp也是练得少啊 。。弄了半天才好。。这个就是把数字看成叶子,把?看出非叶子结点就行了。。。然后其实+-号的个数只看其中一个,另外一个就已经知道了,不用理会。。设d[i][j]、f[i][j]为使用了j个+号,i结点为根子树中的表达式的最大值和最小值然后分别转移就可以。。注意无论最大还是最小,+和-都要尝试。。举一些全为负数的例子应该就能明白。。最后坑爹的地方就是。。把原创 2018-02-22 15:00:26 · 404 阅读 · 0 评论 -
poj3071(概率dp)
这个就是纯概率问题了。。直接把对手的胜率乘上自己的胜率再乘自己打赢对方的概率就行。。。题目设计成分治的样子,用分治写就很舒服了。。/** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ *原创 2018-02-22 15:32:59 · 151 阅读 · 0 评论 -
cf148d(概率dp)
蛙。。这题写得窝好虚蛙。。不过还能1A(开心本来想着说设跑了i个白鼠j个黑鼠的概率为d[i][j]。。。不过发现转移的时候方向实在太难搞定了。。所以换成了跑了i个鼠,其中有j个黑鼠的概率为d[i][j](这里的概率指还未分出胜负的概率)这样就可以比较容易地转移了,就是直接乘法原理。。具体概率自己算比什么都快,这里不列。。然后在转移的同时吧公主胜的情况的概率给求一下就可以了。。。原创 2018-02-22 23:05:31 · 318 阅读 · 0 评论 -
cf940e(优先队列/单调队列+dp)
这场可以说是相当水了。。然而一下涨了辣么多很高兴:)这题题意看了很久。。楞是看不懂(怀疑自己和外国人的思维有些脱节?)。。然后还是别人告诉的题意。。这题的话咋看无从下手,其实我们的目标就是要尽可能去掉多的数。一个数只能被整段区间去掉,而区间长度只能c的整数倍,因为再加上一两个元素没有作用,然后再想一下可以知道,如果2*c长度的区间分成2个长度为c的区间其实更合适,因为如果2个区间和并,原创 2018-02-24 22:09:54 · 587 阅读 · 0 评论 -
poj2151(概率dp)
要全部人都过1题而且至少有人过n题的概率。。可以这么算,(1-全部人0题)*(1-全部人做了不多于n-1题(在无人做0题的前提下))所以dp这块主要是算对每个人做了i题的概率而已,直接递推即可。。然后被一个细节坑害了好久。。要是有一个人一题都做不出的话,那个条件概率的公式里面那个不做0题的概率作为分母是0。。然后会gg.... qaq /** ...原创 2018-02-27 16:56:51 · 191 阅读 · 0 评论 -
poj2096(概率dp)
之前碰过这题的一维形式,随便也说一下题解吧。。在已经收集了i个类型之后,再选一个能得到新类型的概率是(n-i)/n,所以要收集到第i+1个类型要选取的个数的期望是n/(n-i),所以收集n个类型的期望是sum(n/(n-i))然而这方法貌似不能应用于二维。。因为到达d[i][j]的方法不止一种。。。如果这种思路还能再推广到二维的话请务必赐教orz然后标解貌似是一个比较通用的思路。。直接原创 2018-03-01 23:28:27 · 231 阅读 · 0 评论 -
hdu3853(概率dp)
这个题和上个题还蛮像。。Homura好评!!设d[i][j]为从i,j位置走到n,m位置的步数期望,输入为a[i][j][k] k=1-3 可以得d[i][j]=a[i][j][1]*d[i][j]+a[i][j][2]*d[i+1][j]+a[i][j][3]*d[i][j+1]+1可得d[i][j]=(a[i][j][2]*d[i+1][j]+a[i][j][3]*d[i][j原创 2018-03-05 12:59:31 · 213 阅读 · 0 评论 -
hdu4405(概率dp+并查集)
这题反而不难啊。。就是设个d[i]为i到走完的期望步数。。然后d[i]从后6步转移过来就可以了。。然后对跳跃情况就是用并查集维护,只能在跳转终点停留,所以只有对跳转终点i才有意义,所以在转移的时候得转移终点的d。。/** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃原创 2018-03-05 21:43:50 · 229 阅读 · 0 评论 -
hdu4336(状压dp+概率dp)
这2dp这么综合起来还是蛮好的。。看到n范围20马上想状压,发现一起取是个坑丫。。所以状压是正确的。。然后转移还是先考虑一下正向转移吧。。然而转移的时候子状态转移的概率不相同就很难办了,结果还是得向逆向转移低头orz然后考虑在当前状态i如果要取到新的卡牌,那么需要算出取到新卡牌的概率t,然后取到新卡牌需要抽取的期望就是1/t了。。然后再加上当前已算出的期望就可以了。。转移方程看原创 2018-03-05 22:34:16 · 192 阅读 · 0 评论 -
hdu4652(概率dp->数学公式)
第一次自己手动写出数学题蛙好感动qaq用汀老师的笔写果然就是不一样然后这个其实是个dp啦。。当然先出dp方程再说。。0看起来比较好搞,先看看0.。。还是很容易出方程的。。设d[i]为获取i个相同的数字之后离目标的期望步数d[i]=d[i+1]/m+(m-i)/m*d[1]+1然后。。这个d[1]感觉。。不是很好搞的样子耶。。本来就是要求d[1]或者d[0]嘛。。然后发现。。...原创 2018-03-07 18:43:49 · 316 阅读 · 0 评论 -
hiho1033(数位dp)
这很明显就是数位dp好伐。。而且也不难啊。。然后搞了半天。。真是越来越菜了qaq直接统计当前累计的f函数值就可以,是加或减可以根据和最高位的位数差来判断了。。不过需要注意的是每个数的最高位数并不相同。。所以需要维护一下最高位数。。另外这个题有个比较坑爹的地方就是很多方案是找不到符合题意的数的。。。所以dp过程中很多d都是0.。所以要判断一下当前状态是否找过了。。用d==0这个来判断真的原创 2018-03-20 20:52:28 · 196 阅读 · 0 评论 -
hiho1063(树型dp)
有点意思这题。。首先要在状态上选好。。看到距离是10^6就放弃将距离放入状态的念头,那么距离就只能放在数组里面了吧。。所以剩下的就是状态就是点和价值了,所以答案反而是在数组下标里面找。。然后转移呢。。考虑到可能有回来和不回来的情况多来一维,然后设d[i][j][k]为在第i点为根的子树要获得j价值的最小距离,k==0表示回来,k==1表示不回来然后先看k==0的情况,对一个确定的i进行转移原创 2018-03-29 21:47:26 · 154 阅读 · 0 评论 -
zoj3537(三角剖分->区间dp)
不说区间dp还真不造要往dp这边想。。求完凸包每个多边形可以用2个端点表示,那么设d[i][j]为以ij为端点的凸多边形剖分完的最小代价为了使转移看起来好看点这里就不把边ij算在内d[i][j]=min{d[i][k]+d[k][j]+a[i][k]+a[k][j]} k=i+1...j-1这就变成了水dp了嘛。。然后区间dp用记忆化搜索写起来十分舒服,比以前的写法要轻松原创 2018-03-30 23:37:18 · 244 阅读 · 0 评论 -
hiho1718(LIS)
就是求2段下降子序列的和的最长,那正向一次LIS,反向一次LIS,然后枚举分界点就可以了。。/** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ * ┃ ┃ *原创 2018-04-02 10:53:30 · 226 阅读 · 0 评论 -
lightoj1422(区间dp)
英语贼差,读不懂题意。。其实就是给你n天要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿,问这n天最少需要准备多少件衣服然后只需要考虑一件事就可以了,穿上一件衣服,什么时候才脱下来。。令d[i][j]为i到j天需要的衣服数d[i][j]=min{d[i][k-1]+d[k+1][j]} (a[i]==a[k]) =min{d[i][k]+d[k+1][j]} (原创 2018-04-02 11:12:46 · 108 阅读 · 0 评论 -
hdu5723(树形DP+MST)
第一问就是裸MST。。第二问求2点之间距离期望。。就是把距离和全求一遍然后除以n(n-1)嘛。。所以就是求距离和了。。经典树DP。。对每个点X分别枚举累加节点深度和(深度指到子树根的距离),对每个儿子t,只要用距离和乘t的节点数,再加上t距离和乘以当前x的节点数,就能算出经过x的路径和了。。#include<bits/stdc++.h>#define inc(i,l,r) for(i...原创 2018-04-15 17:04:21 · 429 阅读 · 0 评论 -
loj507(dp)
题目标签用的区间dp然而窝并没有用到(讲道理区间dp怎么说都得O(n)啊喂。。然后根据这个题意是很容易出个暴力dp的。。当然很显然用前缀和求会更快。。事实上也只用前缀和,原始数据还用不上。。设d[i]为对前i个牌,收取第i个牌时的最大收益,而b为权值的前缀和,c为d的前缀最大值d[i]=max{c[k-1]+b[i]-b[k-1]} k=1-n且a[i]==a[k]这样原创 2018-04-18 22:25:35 · 310 阅读 · 0 评论 -
luogu2766(dp+网络流)
第一问dp就不说了。。然后这个网络流的建图思路就有点神奇了。。第一问的LIS用的是传统的N^2dp做。。然后可以算出以每个数为结尾的LIS,记为dp[i],将第一问答案记做s然后其实答案最多就是dp[i]等于s的个数,然后剩下的就是看他们能不能找到自己前面的子列了。。首先考虑找s-1位置的数字,显然是要找dp[i]==s-1的数字,如果这个i找不到s位置的数字,那么这个数还是否有用呢?答案是没有。...原创 2018-05-10 21:27:28 · 213 阅读 · 0 评论 -
hdu2224(TSP->dp)
这也是个TSP问题。。不过他的路径是单向的2条路径,所以并不需要状压。。设其中一个路径到了i另一个到了j的代价为d[i][j]且假设i<j,可以得到前j个点已经走过了。。那么可以让j一直先走,然后问题就是i什么时候才走呢?可以让i直接走到j+1的位置,然后此时的状态就变成了d[j][j+1],即2个路径在状态表现出来的地位上发生了互换,那么此时就轮到i一直走了。。所以可以得到转移如下:d[i...原创 2018-05-18 21:14:44 · 202 阅读 · 0 评论