区间dp
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
ural1183&&poj1141 Brackets Sequence(区间DP+记录路径)
黑书动规1.5.1例题1,原题多了记录路径,要递归打印出来。 dp[i][j]表示s[i…j]需加至少多少个括号才能变成合法的。原创 2017-07-29 11:47:27 · 276 阅读 · 0 评论 -
luogu1018【2000提高】乘积最大(区间dp)
dp[i][k]表示在1..i切k刀,分成k+1部分的最大乘积。a[i][j]表示s[i…j]这个数。状态数O(nm)O(nm),预处理O(n2)O(n^2),决策O(n)O(n),转移O(1)O(1),总的时间复杂度O(n2m)O(n^2m)。按照题目叙述应该高精,太懒没写。。居然水过。。。嗯,noip嘛,骗分就好了。 upd:最新版看这里:传送门原创 2017-07-30 20:17:03 · 389 阅读 · 0 评论 -
luogu1043【2003普及】数字游戏(区间dp)
在后面再复制一遍,把环变成链。dp[k][i][j]表示把i…j(包括i,j)分成m部分能获得的最值。状态数O(mn2)O(mn^2),决策O(n)O(n),转移时间O(1)O(1),总的时间复杂度O(mn3)O(mn^3)原创 2017-07-30 20:07:14 · 491 阅读 · 0 评论 -
luogu1063【06提高】能量项链(区间dp)
dp[i][j]=max{dp[i][k]+dp[k+1][j]+a[i]∗a[j+1]+a[k+1]|i<=k<j}dp[i][j]=max\{dp[i][k]+dp[k+1][j]+a[i]*a[j+1]+a[k+1] | i<=k<j\}原创 2017-11-09 22:08:04 · 369 阅读 · 0 评论 -
NOIP2003提高组
2003提高 A.神经网络(拓扑模拟) B.侦探推理(字符串+模拟) 太恶心了,不会写。 C.加分二叉树(区间dp+树的遍历) 因为中序遍历是1~n,所以如果根是k的话,左子树一定是1~k-1,右子树一定是k+1~n。这样就可以区间dp了。顺道记一下跟,方便输出前序遍历 D.传染病控制(搜索+剪枝) 实质上相当于在每层选一条边砍掉,可以爆搜,加个最优性剪枝。注意一个点安全了,只要它的祖先原创 2017-11-18 15:40:10 · 658 阅读 · 0 评论 -
bzoj1090 [SCOI2003]字符串折叠(区间dp+Hash)
f[i][j]表示把i…j压缩的最小长度,我们有转移 f[i][j]=min{f[i][k]+f[k+1][j] |i<=k<j}f[i][j]=min\{f[i][k]+f[k+1][j]\ |i<=k<j\} 如果i…j有循环节k的话,还有转移 f[i][j]=min{f[i][i+k−1]+dig[j−i+1/k]+2}f[i][j]=min\{f[i][i+k-1]+dig[j-i+1原创 2018-03-20 20:24:06 · 281 阅读 · 0 评论 -
bzoj1068 [SCOI2007]压缩(区间dp)
真的是神orz f[l][r][0/1]表示压缩l~r,中间有没有M的最小长度。我们默认l前面有一个M(因为题目说一开始最左端有个M,方便讨论) 然后f[l][r][0]=min(f[l][k][0]+r-k) f[l][r][1]=min(f[l][r][1],min(f[l][k][0],f[l][k][1])+1+min(f[k+1][r][0],f[k+1[r][1]))。 如果l~原创 2018-04-01 23:24:46 · 214 阅读 · 0 评论 -
bzoj1055 [HAOI2008]玩具取名(dp)
f[i][j][t]表示si~sj能否变成字母t。区间dp即可。 复杂度O(n3163)O(n^316^3),但是常数小可以过。原创 2018-04-10 10:38:34 · 204 阅读 · 0 评论 -
bzoj2037 [Sdoi2008]Sue的小球(区间dp)
首先把所有点(包括起点)按x从小到大排序。然后我们肯定是从起点开始贪心的走到左边离我最近的或者右边离我最近的收掉。因此我们可以区间dp, f[0][i][j]表示取完了i~j的彩蛋,目前在i的最大得分。 f[1][i][j]表示取完了i~j的彩蛋,目前在j的最大得分。 因为我们目前的决策会对以后的所有彩蛋得分也有影响,因此可以把这个影响也计算到当前状态中。即 f[0][i][j]=y[i]+原创 2018-04-19 22:01:15 · 246 阅读 · 0 评论 -
CF607B Zuma(区间dp)
给定一个序列,每次操作可以选择一个回文子串删掉,问把整个序列删除所需的最小操作次数。我们区间dp,f[i][j]表示把i~j都删掉的最小花费 转移有两种: 1、i,j没有在一次被删掉,f[i][j]=f[i][k]+f[k+1][j] 2、a[i]==a[j],i,j在一次被删掉,那么在删i+1~j-1的最后一下时把i,j也带走就好了,因此就是f[i+1][j-1]#include &l...原创 2018-06-25 20:48:49 · 668 阅读 · 0 评论 -
bzoj4953 [Wf2017]Posterize(区间dp)
首先把原题转化一下,就是有256个位置,有n个位置上有人,你可以在k个位置上插旗,每个人都会走到离自己最近的旗子,求所有人走的距离的平方和的最小值。f[i][j]表示前i个位置,放了j个旗子,其中第i个位置一定放了旗子的最小平方误差,则f[i][j]=min{f[k][j-1]+w[k][i]|j-1<=k< i},其中w[k][i]表示k~i这一段只有k和i位置放了旗子的平方误差。最后统计答案,枚原创 2017-09-03 20:28:23 · 780 阅读 · 0 评论 -
bzoj1096 [ZJOI2007]仓库建设(斜率优化)
基本和锯木厂一样。dp[i]表示在i建一个锯木厂的最优方案。则 dp[i]=min{dp[j]+c[i]-c[j]-sw[j]*(sd[i]-sd[j]}+w[i]。 具体见锯木厂。原创 2017-08-05 21:04:09 · 361 阅读 · 0 评论 -
bailian4122:切割回文(区间dp)
dp[i]表示把前i个都变成回文串最少需要切割的次数。每次枚举在j后面切一刀,暴力判断(j+1,i)是否是回文,如果是,那就是要切割dp[j]+1次。取最小即可。原创 2017-08-07 16:25:39 · 576 阅读 · 0 评论 -
CEOI 2004 two 锯木厂(cogs)(斜率优化)
Description 从山顶上到山底下沿着一条直线种植了n棵老树。当地的政府决定把他们砍下来。为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。 木材只能按照一个方向运输:朝山下运。山脚下有一个锯木厂。另外两个锯木厂将新修建在山路上。你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小。假定运输每公斤木材每米需要一分钱。 你的任务是编写一个程序,从输入文件中读入树的个数和原创 2017-08-05 20:37:20 · 659 阅读 · 0 评论 -
bzoj4518 [Sdoi2016]征途 (斜率优化)
求方差的套路见过了,所以直接A掉了hh 答案表示一下就是∑i=1m(x¯−xi)2m∗m2\frac{\sum\limits_{i=1}^m(\overline{x}-x_i)^2}{m}*m^2,其中x¯=∑i=1mxim\overline x =\frac{\sum\limits_{i=1}^mx_i}{m},记前缀和sum,则sum[n]显然就是∑i=1mxi\sum\limits_{i=1原创 2017-08-08 17:38:07 · 383 阅读 · 0 评论 -
bzoj3675 [APIO2014] 序列分割(斜率优化)
首先我们根据这个分割的过程可以发现:总得分等于k+1段两两的乘积的和(乘法分配律),也就是说与分割顺序是无关的。再对乘积进行重分组(还是乘法分配律)我们可以转化为:ans=∑第 i 段×前 i-1 段的和,那我们可以认为这k+1段是从左到右依次分出来的。假设目前这段是j+1…i,则他对答案的贡献为(sum[i]-sum[j])*sum[j].这样就很容易可以得到O(kn2)O(kn^2)的状态转移方原创 2017-08-08 16:24:31 · 371 阅读 · 0 评论 -
poj1390 Blocks(区间dp)
黑书1.5.2例题1 方块消除 首先把相邻的同色块合并成一块,记录col[i],len[i],tot[i]此块后面可能再接的最大长度。用dp[i][j][k]表示区间i…j,在j块以右又接了长度k的最高得分。现在考虑第j块后面接了长度k,我们有两种策略: 1、直接消掉,那么得分就是dp[i][j−1][0]+(len[j]+k)2dp[i][j-1][0]+(len[j]+k)^2 2、在i…原创 2017-08-01 21:54:22 · 465 阅读 · 0 评论 -
ural1143 Electric Path (区间dp)
黑书1.5.2 例题7 青蛙的烦恼 没找到原题,这个题和原题差不多吧,就是没规定从1开始,可以从任意点开始,难了一点点吧。首先可以证明:最短路径一定没有交叉边,否则还可以更短。这就要求我们i点,只可能跳到i+1,i+len-1两点。这样就有了最优子结构,用dp[0][i][len]表示从i开始,遍历{i..i+len-1}中的顶点一次且仅一次的最短距离。dp[1][i][len]表示从i+len-原创 2017-08-04 12:19:48 · 390 阅读 · 0 评论 -
bzoj1084 [SCOI2005]最大子矩阵(dp)
因为m<=2,就两种情况,所以分开做就好了。 1.m=1.那就是找k段连续和最大。dp[i][k]表示前i个数选k段的最大和。不选的话dp[i][k]=dp[i-1][k],选取j+1…i做为第k段的话,值为dp[j][k-1]+sum[1][i]-sum[1][j],取最大即可。 2.m=2.dp[i][j][k]表示第一列前i个,第二列前j个,一共选了k个矩阵。 (1)可以不选: dp[原创 2017-08-04 14:12:52 · 348 阅读 · 0 评论 -
luogu1880 合并石子(区间dp)
环形石子堆,我们首先要拉成直链(在后面复制一遍即可)。然后区间dp,dp1[i][j]表示合并第i到j堆的最小得分。最后答案就是min{dp[i][i+n−1]}(1≤i≤n)min\{dp[i]\left[i+n-1\right]\}(1\leq i\leq n).最大得分同理。时间复杂度O(n3)O(n^3)原创 2017-07-29 17:21:51 · 372 阅读 · 0 评论 -
poj1160 [IOI2000] Post Office(区间dp+四边形不等式)
首先求出在第i个到第j个村庄中只建立一个邮局的最优距离,用数组dis[i][j]表示。dis[i][j]=dis[i][j-1]+a[j]-a[(i+j)/2]; (村庄位置为a[i])显然邮局建在中心a[(i+j)/2]最优,如果有两个,建在哪个中心都可以。画画图就可以理解了。然后用数组dp[i][k]表示在前i个村庄中建立k个邮局的最小距离。则 dp[i][k]=min{dp[j][k−1]+原创 2017-08-05 15:55:20 · 524 阅读 · 0 评论 -
CF392E Deleting Substrings(区间dp)
题意就是说给你一个序列a,你每次可以选择一段“山峰形”子串删掉,获得v[长度]的价值,价值可能为负。可以不全删掉,求最大价值。 f[i][j] 把i~j都删掉的最大价值 g[i][j] 把i~j删成a[i],a[i]+1,…,a[j]的形式的最大价值 h[i][j] 把i~j删成a[i],a[i]-1,…,a[j]的形式的最大价值 dp[i] 前i个的最大价值 #include <...原创 2018-06-26 19:46:41 · 545 阅读 · 0 评论