![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
----------DP----------
文章平均质量分 64
IcePrincess_1968
这个作者很懒,什么都没留下…
展开
-
BZOJ1177: Oil 题解
Description采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。 Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值。 为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K块相连的土地构成的正方...原创 2018-08-07 22:41:44 · 525 阅读 · 0 评论 -
四边形不等式和完全单调性
四边形不等式 如果有一个矩阵MMM,对于任意a<ba<bac<dc<dcM(a,c)+M(b,d)≥M(a,d)+M(b,c)M(a,c)+M(b,d)≥M(a,d)+M(b,c)M(a,c)+M(b,d)\geq M(a,d)+M(b,c),我们称这个矩阵满足四边形不等式 我们考虑一个简单的问题:如何验证一个矩阵是否满足四边形不等式? 显然有O(n2m2)O(n2m...原创 2018-04-18 16:51:15 · 780 阅读 · 2 评论 -
BZOJ1912: 巡逻 题解
这道题很像topcoder里的一道题kingdomtour,是它的弱化版,可以看我的那道题的博客,一个树型dp,复杂度O(nk2)O(nk2)O(nk^2)#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <cstdli...原创 2018-04-12 17:09:16 · 267 阅读 · 0 评论 -
BZOJ4518: 征途 题解
方差的定义都记不得了,还查了一波百度百科… dp[i][j]表示已经考虑了i天,考虑到第j段路的最小方差,可以这样算的原因是这串数的平均数已经确定了,是summsumm\frac{sum}{m},所以后面的分配不会影响前面的贡献 显然有dp[i][j]=minj−1k=1dp[i−1][k]+calc(j+1,i)dp[i][j]=mink=1j−1dp[i−1][k]+calc(j+1,i)...原创 2018-04-18 11:21:44 · 220 阅读 · 0 评论 -
BZOJ1911: 特别行动队 题解
这显然是一道dp+斜率优化题 开始大力推公式 dp[i]=minj=1i−1dp[j]+f(sum[i]−sum[j]),其中f(x)=ax2+bx+cdp[i]=minj=1i−1dp[j]+f(sum[i]−sum[j]),其中f(x)=ax2+bx+cdp[i]=\min_{j=1}^{i-1}dp[j]+f(sum[i]-sum[j]),其中f(x)=ax^2+bx+c 展开,dp[...原创 2018-04-12 12:50:22 · 247 阅读 · 0 评论 -
BZOJ2964: Boss单挑战 题解
非常难写的dp背包 如果我们把魔法值,怒气值,血量放在一起考虑,状态数会爆炸 但我们发现,与魔法值,怒气值,血量相关的操作是互不影响的,所以我们可以分开来dp 有一个细节要注意:每轮是主角先操作,所以如果主角干掉了Boss,事实上主角比Boss多操作了一次 与怒气值相关的操作有普攻和怒攻 与魔法值相关的操作由嗑魔法药和魔攻 与血量相关的操作有嗑血量药和被Boss打 令dp1[i][j...原创 2018-04-12 10:56:58 · 341 阅读 · 1 评论 -
(权限题)NFLSoj #103: 小D的道路 题解
感觉有点像网络流,但不会搞 看到数据范围又不由得往状压dp方面想 我们可以发现,一个图是优美的,则它的形状一定是一条从1~n的链,其中链上的每个点挂着一个子图 考虑dp[Mask][i]表示当前已经将Mask中的节点加入地图,主链的末端点是i的最大边权 考虑向后转移,有两种情况: 1. 向主链的后面添加一个节点,我们可以枚举Mask之外的每个点u,看i,u之间是否有边 即dp[Mask...原创 2018-03-29 16:04:04 · 425 阅读 · 0 评论 -
Codeforces #251C: Number Transformation 题解
这道题贼像贪心,于是上来就大力乱搞一波,结果WA了 如果数据范围很小,我们自然可以考虑这样的dp 令dp[i]表示当前的数字是i,想要变成b的最小步数,这个只要记忆化搜索就好了 然而这样是O(a)O(a)O(a)的,a≤1018a≤1018a\leq10^{18},还得再想办法 我们抓出2~k的某一个i单独考虑,只有-(a mod i)和-1两种操作,我们可以发现一个性质:这个数一定会经过...原创 2018-04-17 17:02:33 · 230 阅读 · 0 评论 -
AtCoder Grand Contest 019E: Shuffle and Swap 题解
非常好的dp+组合题 这个版本的做法参考了tourist的editorial 我们不考虑两个序列的random shuffle,而是考虑这样的两个操作 1. 确定a序列和b序列的匹配方法 2. 确定这些匹配方法的出现顺序 我们考虑a序列和b序列匹配好以后,在A序列里面每个ai向bi连一条有向边 我们发现A序列的每个位置只有三种情况 1. 有某个a对应没有b对应,这样这个点只有出边 ...原创 2018-04-17 11:27:18 · 291 阅读 · 0 评论 -
TopCoder SRM469C: TheMoviesLevelThreeDivOne 题解
很好的dp题目 我们尝试推断某一个人A能不间断的看完电影的条件 易得,A想要在看完B的第i-1部电影之后不间断的看B的第i部电影,应该满足以下条件:∑Atotk=1A[xk]+∑i−1k=1A[yk]−∑ik=1B[yk]≥0∑k=1AtotA[xk]+∑k=1i−1A[yk]−∑k=1iB[yk]≥0\sum_{k=1}^{Atot}A[x_k]+\sum_{k=1}^{i-1}A[y_k]...原创 2018-04-16 16:43:58 · 348 阅读 · 0 评论 -
ZOJ4007: Maching Learning on a Tree 题解
这道题看起来很难很高端,仔细读一遍以后发现是水题 它规定了所有的xixixi都相等,意味着所有的wij=e0=1wij=e0=1w_{ij}=e^{0}=1 所有的点的权值只能是0或1 考虑树型dp,dp[i][0/1]表示当前考虑以i为根的子树,i的权值是0/1的最小代价 转移非常简单#include <cstdio>#include <iostream>...原创 2018-04-03 16:09:16 · 169 阅读 · 0 评论 -
Codeforces #101D: Castle 题解
尝试思考每棵子树应该按照什么样的顺序访问 要访问完一棵树的总时间肯定是这棵树内所有的边权之和×2,将这个值定义为T(x)T(x)T(x),其中xxx表示子树的根,再定义sz(x)sz(x)sz(x)表示以xxx为根的子树的节点数,考虑某个节点的两棵子树x,yx,yx,y,如果先访问xxx比先访问yyy更优,那么应该满足如下条件: T(x)+T(x)∗sz(y)+T(y)<T(y)∗T(y...原创 2018-04-10 09:17:21 · 238 阅读 · 0 评论 -
比较学习-BZOJ3450: Easy 题解 和 BZOJ4318: OSU! 题解
这两道题长得几乎一模一样,只不过easy求的是平方,OSU求的是立方 于是决定把这两题一起切掉,没想到这其中大有玄机,还是我naive啊…我们先看easy这题 考虑期望dp;dp[i]表示考虑到第i位的时候以i结尾的连续一段的期望长度 那么如果这位是o,dp[i]=dp[i-1]+1 如果这位是x,dp[i]=0 如果这位是?,dp[i]=(dp[i-1]+1)*0.5 根据期...原创 2018-05-01 15:58:32 · 299 阅读 · 1 评论 -
AtCoder Regular Contest 083E: Bichrome 题解
首先,一棵子树究竟是白色满足Xi还是黑色满足Xi是无关紧要的,因为我们总可以翻转所有的节点来得到满足条件的解 对于每棵子树,某种颜色的权值和已经是固定的了,我们自然关注另一种颜色的权值和 可以想到dp[i][j]表示当前在考虑以i为根的子树,与根颜色不同的节点权值和是j且该子树内所有的Xi均满足能否实现 我们显然希望通过对子树背包来实现这一点 我们令dp2[i][j][k]表示当前考虑到第...原创 2018-04-20 16:56:27 · 259 阅读 · 0 评论 -
UOJ #275: 组合数问题 题解
非常好的题目,感觉这个lucas的应用算是常见套路了吧 题目要求CMN≡0(modk)CNM≡0(modk)C_N^M\equiv0(modk),因为k是质数,所以根据Lucas定理,CM/kN/k∗CMmodkNmodk≡0(modk)CN/kM/k∗CNmodkMmodk≡0(modk)C_{N/k}^{M/k}*C_{Nmodk}^{Mmodk}\equiv 0(modk) 我们发现这个...原创 2018-07-22 14:31:28 · 638 阅读 · 0 评论 -
UOJ #316: 泳池 题解
我觉得这个dp还挺难的 首先计算面积恰好为k的比较难办,不妨容斥,计算面积不大于k的,减去面积不大于k-1的就是恰好为k的 对于一个段,我们关心的显然是最下面的危险区域,因为上面的对最终的矩形划分是没有影响的 考虑dp[i][j]表示考虑宽度为j的区间,前i-1行都没有危险区域,第i行有危险区域,能圈出的最大面积不大于k的概率,这里的概率暂时不考虑1~i-1行都不危险的那部分的q的若干次方 ...原创 2018-07-12 23:04:27 · 242 阅读 · 0 评论 -
Codeforces #995F: Cowmpany Cowmpensation 题解
非常好的dp题 首先可以参见topcoder randomapple的套路,就是我算这棵树的权值种数为i的方案数,最后乘CiDCDiC_D^i就好 考虑dp[i][j]表示以i为根的子树,i的权值不超过j的方案数 我们发现这样会重复计数,因为我们计算了一些本质相同的方案,比如全1和全2,他们各自在乘CiDCDiC_D^i的时候会把对方算进去 所以我们实际上要算的是本质不同的方案数 dp[...原创 2018-06-30 21:46:55 · 601 阅读 · 2 评论 -
URAL1627: Join 题解
把地图看成去掉障碍物的网格图,就可以用矩阵树定理直接算生成树个数了 矩阵树定理: 一个无向图的度数矩阵:di,j=degidi,j=degid_{i,j}=deg_i当且仅当i=ji=ji=j 一个无向图的邻接矩阵:Ai,j=1Ai,j=1A_{i,j}=1当且仅当从iii到jjj有边 一个无向图的基尔霍夫矩阵:Ki,j=di,j−Ai,jKi,j=di,j−Ai,jK_{i,j}=d_{...原创 2018-06-23 08:37:17 · 308 阅读 · 0 评论 -
BZOJ2657: 旅游 题解
把一个凸包进行三角剖分,那么如果把每个三角形看成一个节点,有相邻边的三角形之间连一条边,那么这就成了一个树形结构 我想了一下,认为能连接凸包上两点所经过的三角形,一定是新树中的一条链,所以只要树型dp求最长链即可 处理相邻的三角形有点麻烦,我用了一个比较轻巧的方法:把每个三角形的三条边放进一个map,然后每新读入一个三角形就把他的三条边扔进map里查,如果出现过了就可以连边#inclu...原创 2018-05-31 10:02:46 · 453 阅读 · 1 评论 -
AtCoder Grand Contest 024E: Sequence Growing Hard 题解
神仙题,感觉思路太神奇 题目等价于每次向序列里面插入一个新数,问有多少种方案 我们考虑怎样插入一个新数是合法的,假设当前插入的数是cur,那么有两种情况 1. cur放在序列的末尾 2. cur之后第一个与cur不一样的数比cur小(或者cur后面的数全都和cur一样) 我们发现改一下这个问题的初始条件,不是空序列,而是一个包含一个0的序列,这两种情况就变成只有第二种情况了,而且括号里的...原创 2018-05-21 20:32:09 · 379 阅读 · 0 评论 -
TopCoder SRM450C: RowGame 题解
看到k这么大,我的思维立刻就往什么dp+矩乘或者是倍增上走 dp+矩乘看上去挺靠谱的,但是题目要求任意时刻权值非负,那么就得再加一维来控制当前的权值,而当前权值的范围是很大的,这样会超时 于是考虑仔细观察此题的性质 我们可以设想:如果k→infk→infk\rightarrow inf 那么我一定会想办法走到这个序列的最长子串上然后来回摆动 然而并不是能一下子走到最长子串上的,如果中间有一...原创 2018-05-20 21:59:19 · 544 阅读 · 1 评论 -
AtCoder Regular Contest 097F: Monochrome Cat 题解
这道题的思路非常巧妙 首先我们可以把那些全部都是黑点的子树扔掉,他们是不会被遍历的 这时,剩下的树的所有的叶子都是白色的 我们先考虑终点和起点重合的情况 这时如果我们想把它全部变黑的话必须遍历整棵树 并且我们发现,无论以哪个点为起点,答案都是一样的,首先所有的边都要走两遍,第二,一个点被走过的次数等于它的度数,所以一个点是否需要停留一秒也是可以算出来的(显然的是,一个点最多停留一秒),这...原创 2018-05-14 16:30:26 · 644 阅读 · 6 评论 -
AtCoder Regular Contest 097E: Sorted and Sorted 题解
这个题目显然可以转化成:把黑白两个序列往一个大序列里面填,每次填黑的或白的,黑序列和白序列都要有序,每次填有一个代价是这个数之前还没有被填掉的数的个数,求最小的代价 我们考虑dp,dp[i][j]表示黑序列已经填了i个数,白序列已经填了j个数的最小代价 显然dp[i][j]是从dp[i-1][j]和dp[i][j-1]转移来的,现在的重点是如何快速的计算黑序列的第i个数之前还有多少个数没有填,...原创 2018-05-14 16:10:04 · 478 阅读 · 1 评论 -
Codeforces GYM 101173B: Bipartite Blanket 题解
这题的大致思路肯定是左边和右边分开来枚举然后匹配匹配算一算这类的 我刚开始想的是先把完美匹配搞出来,然后在里面选点 但发现无论是选点还是找匹配复杂度都是炸的 我们开始直接考虑那些被选中的点 我们发现一些很好的性质:一个集合XXX满足题意,当且仅当它属于X的部分和属于Y的部分都能形成完美匹配 必要性是显然的,如果不存在的话就不可能有一个完美匹配能覆盖这些点 充分性想一想也挺简单的,这里就...原创 2018-04-27 10:42:02 · 345 阅读 · 1 评论 -
UVa12235: Help Bubu 题解
我们可以发现一个性质:对于所有我拿出来的数,如果剩下的数列里面还有这个数,那我可以放在它旁边,答案不变,否则就要全部放在数列最后面,答案+1 有了这个性质,我们考虑dp dp[i][j][Mask][m]表示当前考虑到第i位,已经抽出了j本书,当前最后一本保留的书是m,Mask的第i位表示的是从1~i所有的i书是否被全部抽出了 转移的话,讨论第i+1本书取还是不取 最后,对于所有的dp[n...原创 2018-04-20 23:15:58 · 338 阅读 · 0 评论 -
Codeforces #219D: Choosing Capital for Treeland 题解
显然的树型dp题 发现一个性质,如果我的首都选在以i为根的子树内,那么无论选的是哪个点,以i为根的子树外面的边最终的指向都是一样的 我们先跑一边dfs,把每棵子树内的向上的边数和向下的边数记录下来 考虑dp[i]表示如果首都在以i为根的子树内,在以i为根的子树内需要翻转的最小边数 有两种转移:首都是i,此时需要翻转的边数就是以i为根的子树内向上的边数首都在i的某个孩子y的子树中,那...原创 2018-04-09 23:01:19 · 226 阅读 · 0 评论 -
BZOJ4753: 最佳团体 题解
首先肯定是01分数规划,先二分答案,设当前答案是xxx,那么每个点的权值就是ai−xbiai−xbia_i-xb_i,我们要在树上取一个包含节点0的大小为k+1k+1k+1的连通块(因为有0所以+1),使得权值最大,然后看这个最大权值是否大于等于0 这个可以考虑树型背包 这个看上去是O(n3)O(n3)O(n^3)的,但有一个小技巧可以让他变成O(n2)O(n2)O(n^2) 我们考虑一个和...原创 2018-04-09 21:42:48 · 215 阅读 · 0 评论 -
Codeforces #48G: Galaxy Union 题解
n个点n条边的连通图,是一个基环外向树先用一遍深搜把环找出来然后对于每一个点的答案,他到树内部的答案可以树型dp搞一搞,到其他树以及到环上的点的答案可以在环上two pointers搞一搞主要是一道代码能力题#include <cstdio>#include <iostream>#include <cstring>#include <string&g...原创 2018-03-06 13:05:52 · 345 阅读 · 0 评论 -
USACO 2018 January Contest Platinum A: Lifeguards 题解
将所有的区间按左端点从小到大排序我们处理那些被完全包含的区间,这些区间即使删除也不会使答案变坏这样先删一波,如果发现这种小区间的个数多于k,就可以直接算答案了否则我们要dp设dp[i][j]为考虑到第i个区间,已经删除了j个区间,且第i个区间没有被删除的情况下最大的覆盖长度显然有状态转移方程dp[i][j]=max(dp[k][j-i-k-1]+第i个区间贡献的覆盖)这个方原创 2018-01-23 23:58:14 · 1637 阅读 · 0 评论 -
【NOIP2015-Day2-T2】洛谷2679:子串 题解
显然dpdp[k][i][j]表示当前匹配了k次,A串匹配到了第i个,B串匹配到了第j个的方案数一方面,A串的第i个可以不和B串匹配,此时dp[k][i][j]+=dp[k][i-1][j]另一方面,A串可以选择与B串相同的某长度的后缀与B作为第k次匹配,dp[k][i][j]+=dp[k-1][i-m][j-m],m枚举公共后缀的长度可以预处理数组far[i][j]表示A串第i个原创 2017-11-06 16:19:12 · 262 阅读 · 1 评论 -
AtCoder Grand Contest 013D: Piling Up 题解
非常难的dp容易想到状态dp[i][j]表示当前进行了i轮操作,第i轮操作结束后盒子里有j个红球的方案数,因为盒子里始终有N个球,所以蓝球的个数为N-j,于是可以转移但这样有些状态会重复计数例如:设N=2,则开始状态是Red=2,Blue=0时,可以获得“取出序列”Red,Blue,Red,Blue...当开始状态是Red=1,Blue=1时,也可以获得“取出序列”Red,Bl原创 2017-10-03 23:14:39 · 354 阅读 · 0 评论 -
Codeforces GYM 100753J: Souvenirs 题解
这题是显然的dp设dp[i][j][k]为考虑到第i个商人(第i个商人已经处理完),当前有j个金币和k个银币时,最多能买到多少纪念品1.不买第i个纪念品,dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k])2.用金币买第i个纪念品,dp[i][j][k]=max(dp[i][j][k],dp[i-1][j+1][k-get*pack[i]]+1)ge原创 2017-10-02 21:40:57 · 330 阅读 · 0 评论 -
Codeforces #39C: Moon Craters 题解
这道题一看就是dp,但感觉不知道怎样dp刚开始想了一个dp[i]表示在前i个圆里面选互不重叠的最多能选几个,把圆先按右端点排序。但是圆的大小的任意性使得dp不正确后来想了一个非常复杂的dp先按圆的右端点从小到大排序,右端点相同的按半径大小从小到大排序,这样保证在考虑到第i个圆的时候,他不可能被前面的圆包含或是内切于前面的圆对排序后的圆数组先做两个预处理:1.对于圆i,记录右端点原创 2017-07-20 20:23:29 · 572 阅读 · 0 评论 -
Codeforces #831D: Office Keys 题解
这道题我觉得非常好首先很显然的二分答案但是二分答案之后的check有点麻烦第一想到的是跑一个最大流或是匈牙利算法,但这两个都是O(n*n*n)的,总复杂度O(n*n*n*logn)会超时所以这道题在人匹配钥匙的过程中一定有什么特殊的地方我想了一个结论:对于两个人i,j,如果i在j的左边,那么最优方案中i选的钥匙一定在j的左边 (这个结论应该挺好证的,画画图或是用代数式算算就行)原创 2017-07-14 22:31:16 · 455 阅读 · 0 评论 -
Codeforces #13C: Sequence 题解
有一个结论是,修改成不下降的子序列要求步数最少,那么每个数都应修改成数组中已有的数(然而这个结论我不太会证,请大神指教)于是可以dp先把所有的数放进一个数组b,sort再unique一下设dp[i][j]表示当前考虑到第i个数,第i个数不超过b[j]的最小修改次数如果第i个数不是b[j],那么dp[i][j]=dp[i][j-1]如果第i个数是b[j],那么dp[i][j]原创 2017-07-13 21:16:54 · 433 阅读 · 0 评论 -
Codeforces #713C: Sonya and Problem without a Legend 题解
如果做过cf 13C sequence应该马上就能发现这两道题惊人的相似但是这题要求严格递增,怎么办呢?于是有一个神奇的做法对于a[i],将其减去i,得到新数组b,b数组中只要保证不下降,a就能保证严格递增于是可以上dp代码了(dp方程可以看13C sequence)#include #include #include #include #include #inc原创 2017-07-13 21:24:36 · 1280 阅读 · 0 评论 -
Codeforces #803E: Roma and Pokers 题解
这题显然的dp设dp[i][j]表示当前考虑到第i个位置,胜场比负场多j个能否做到,同时记录转移的坐标方便打印因为j可能是负的,所以要加一个base如果当前位是W:dp[i][j]=dp[i-1][j-1]如果当前位是L:dp[i][j]=dp[i][j+1]如果当前位是D:dp[i][j]=dp[i-1][j]如果当前位是?:上面三种情况都考虑一遍注意:转移的时候ab原创 2017-07-13 21:35:51 · 482 阅读 · 0 评论 -
Codeforces #360B: Levko and Array 题解
首先问题满足单调性,所以可以二分答案,设二分出的答案为h这题n设dp[i]为第i个数字不修改时满足答案h最少要修改的次数枚举上一次不修改的位置j那么j+1~i-1的位置的数都是要修改的一个显然的结论是,这n个数应该修改得使其均匀的分布在a[i]~a[j]之间,这样相邻差的最大值最小,为abs(a[i]-a[j])/i-j 上取整所以如果算完在h之内,dp[i]=min(dp原创 2017-07-10 22:40:12 · 493 阅读 · 2 评论 -
Codeforces GYM 100962J: Jimi Hendrix 题解
显然树形dpdp1[i]表示以i为根的子树中从左往右最多能匹配多少位,dp2[i]表示以i为根的子树中从右往左最多能匹配多少位dp数组同时记录这个max是从哪个叶子跑上来的dp1[i]和dp2[i]能很简单的从i的孩子那里统计得到然后对于任意i,只要dp1[i]+dp2[i]>=m 就说明有答案要注意从左往右和从右往左要从不同的孩子那里获得,所以烦一点的话可能要写一个second_max#i...原创 2018-01-23 11:47:52 · 340 阅读 · 0 评论 -
Codeforces #49E: Common Ancestor 题解
首先可以发现一个性质:祖先字符串的一个字符一定对应着孩子字符串的一个区间于是可以dpdp[i][j]表示s1考虑到第i位,s2考虑到第j位,祖先字符串的最短长度枚举祖先字符串的最后一个字符对应了孩子字符串的哪个区间所以枚举x,y,dp[i][j]=if (s1的x+1~i和s2的y+1~j可以由同一个字符扩展而来) min(dp[x][y]+1)if中的内容可以再用一个区间dp预处理一下dp2[l...原创 2018-03-05 15:24:27 · 255 阅读 · 0 评论