
动归
zhouyuyang233
此乃ZJ之蒟蒻也
望大牛勿喷
我等蒟蒻感激不尽
展开
-
bzoj1395: [Baltic2005]Trip
传送门 我们可以将问题转化为中间乘坐公交的最长时间。 然后我们对于每条边我们把它当成在a时刻出发,中间乘坐时间为c-b,到达时间为d的一条线路。 然后你就可以想到一个O(NM)的动归, f[i][j]表示在j时刻到达i的左右答案 当然那一定是TLE+MLE 于是我们考虑优化。 我们发现原方程有两种转移: 1:f[i][j]=f[i][j-1] 2:f[i][j]=f[k][l]+d原创 2017-07-27 21:51:33 · 334 阅读 · 0 评论 -
bzoj4922: Karp-de-Chant Number
传送门 首先题目显然是要在排序过后dp。 dp状态很好想,就是f[i][j]表示前i个字符串,有j个左括号没匹配的方案数。 显然时间复杂度是O(N^3) 问题是怎么排序。 首先,使得左括号数增多的显然要放在使得左括号数减少的前面。 对于使得左括号数增多的字符串,在处理时左括号值减少的最小值较大的串放在前面。 至于左括号数减少的串,最终值减去在处理时左括号值减少的最小值较大的串放在前面。原创 2017-06-19 08:53:46 · 559 阅读 · 1 评论 -
bzoj1183: [Croatian2008]Umnozak
传送门 大力枚举每个数位上的树的乘积的质因数分解形式。 然后大力在里面dp求出可行解方案数。 大概就是前p个数,还剩i个2,j个3,k个5,l个7. 在不加任何优化的情况下,目前排名Rk2 (倒数)#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<a原创 2017-05-22 21:23:37 · 395 阅读 · 0 评论 -
bzoj1151: [CTSC2007]动物园zoo
传送门 动态规划大水题。。。 令f[i][j]表示考虑第1~i个位置,i~i+4位置上面移走或者不移走的状态为j时的最优解。预处理g[i][j]表示在第i位状态为j时的收益,这样就可以O(1)转移了。 由于题目是环,因此要求首尾的部分状态要重叠;枚举前4位固定不变的状态在进行dp。 然后就水过辣。#include<cstdio>#include<cmath>#include<ctime>原创 2017-05-21 20:25:31 · 406 阅读 · 0 评论 -
bzoj1814: Ural 1519 Formula 1
传送门 插头DP入门题。 首先可以看一下cdq的PPT 然后按照类似的做法就可以了。 注意,哈希表开太大会在赋值时TLE,但是开太小会导致哈希效率不高。 经计算,本题状态数不到8W,所以开20W足够了。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#includ原创 2017-06-15 21:14:41 · 543 阅读 · 0 评论 -
bzoj1806: [Ioi2007]Miners 矿工配餐
传送门 设f[i][x1][x2][y1][y2]表示前i车食品,前两车送往A的是x1x2,送往B的是y1y2的最优答案。 转移枚举当前食品车放A还是B。 罕见Pascal代码。var i1,i2,j1,j2,n,k,t,k1,k2,max,l:longint; p,q:boolean; c:char; s:set of 0..4; d,e:array[0..3] of i原创 2017-06-15 21:04:18 · 236 阅读 · 0 评论 -
bzoj1111: [POI2007]四进制的天平Wag
光棍专属题目233 传送门 显然是要dp的辣。 设f[i]表示前i位的最小花费。 g[i]表示前i位,且有进位的最小花费。 转移自己yy一发就ok辣。 扯淡,还要高精度呢。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#原创 2017-05-19 18:45:11 · 405 阅读 · 0 评论 -
bzoj4881: [Lydsy2017年5月月赛]线段游戏
传送门 为什么感觉我的做法不一样一点的呢? 首先,我们可以发现题目要求的就是将那个原序列分解成两个递增序列的方案数*2(两个人可以互换取法) 考虑dp求解: 设f[i][j][k]表示前i个数,两个递增序列目前最大值是j和k 发现j,k中必定有一个等于a[i],所以可以压掉一维。 现在是f[i][j]表示前i个数,两个递增序列目前最大值是j和a[i] 然后自己yy一波转移方程,得到:原创 2017-05-06 21:57:16 · 729 阅读 · 0 评论 -
bzoj1419: Red is good
传送门 显然的dp呀。 设f[i][j]表示还剩i张红,j张黑时的最有收益。 转移很好yy:f[i][j]=max(0,i/(i+j)(f[i-1][j]+1)+j/(i+j)(f[i][j-1]-1)) 然后这题卡内存,要开滚存。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<ios原创 2017-05-25 21:07:49 · 316 阅读 · 0 评论 -
bzoj1417: Pku3156 Interconnect
传送门 其实我们不关心联通状态,我们只关心联通块大小。 然后枚举加边情况, 是否连接了不同的联通块。 然后加一个记忆话搜索就可以了#include<map>#include<cmath>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algo原创 2017-05-25 21:01:36 · 313 阅读 · 0 评论 -
bzoj1566: [NOI2009]管道取珠
传送门 两次取的序列一样,可以看成两个人分别玩一次,然后两个人得到的序列一样. 那这个题就变成了两个人各玩一次,求第一个人每次得到的序列在第二个人得到的序列中出现的次数和. 设f[i][j][k]表示第一个人上面用J颗,第二个人上面用k颗,产生序列相同的方案数。 手玩DP方程一发 然后就水过了。#include<cstdlib> #include<iostream> #inclu原创 2017-05-05 16:00:53 · 324 阅读 · 0 评论 -
bzoj1564: [NOI2009]二叉查找树
传送门 改变后的权值不能相同 但是由于可以改成任意实数 而且代价与更改的大小无关 所以其实相同与否无所谓了 所以题目有时也有废话 首先键值是不能更改的 而一棵treap的中序遍历保证键值递增 故中序遍历一定 我们先按照键值排序得到中序遍历 w很大 但是保证不重复 所以我们将w离散化 然后就是DP的问题了。。我们令f[i][j][w]表示从i~j的节点构成一棵子树且所有节点权值都大于等于w的原创 2017-05-05 15:45:52 · 381 阅读 · 0 评论 -
bzoj1344: [Baltic2007]Connected Points连点
传送门 插头dp+矩乘优化。 首先大力yy一波这道一定是插头dp 发现状态只有6个。 大概就是这样。(求轻喷) 然后大力人脑转移。(大约30min)的样子。 发现这种东西灰常资辞矩乘优化。 然后就写好了。#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#inc原创 2017-05-24 20:45:19 · 357 阅读 · 0 评论 -
bzoj4832: 抵制克苏恩
传送门 非炉石玩家表示不爽 显然克苏恩刀人只有四种选择。 刀英雄,刀一血奴隶主,刀二血奴隶主,刀三血奴隶主。 显然两个同血奴隶主是等价。 然后枚举克苏恩刀谁,计算期望就行了。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#原创 2017-04-22 18:41:14 · 1072 阅读 · 0 评论 -
bzoj1304: [CQOI2009]叶子的染色
传送门 这道题显然是树DP 我们用F(u,color)表示以u为节点的子树所需的最少节点数,且u刷成color。 F(i,0)表示点i涂黑色,dp(i,1)表示点i涂白色 所以有F(i,0) = sum(min(dp(i.son,1),dp(i.son,0))) 当点i涂黑色时,他涂黑色的儿子可以少涂一个点,i涂白色时同理 然后就是沙比树形dp了。uses math;var原创 2017-04-22 17:17:57 · 806 阅读 · 0 评论 -
bzoj1560: [JSOI2009]火星藏宝图
传送门 O(N^2)dp是显然的。 考虑优化这个dp 首先(A+B)^2>=A^2+B^2 所以从A->B->C显然比A->C优秀。 根据这个特性,我们可以将点按照纵坐标为第一键值,横坐标为第二键值排序 对于每一列我们维护一个当前纵坐标最大的点 用这个点更新一定比它下面的点更新更优 因此对于每个点枚举横坐标比它小的列更新即可 时间复杂度O(nm) 大概2E左右#include<cstr原创 2017-05-03 21:03:53 · 413 阅读 · 0 评论 -
bzoj1505: [NOI2004]小H的小屋
传送门 用g[i][j]g[i][j]表示南方向上,x轴方向上长度为i的区间,划分成j个矩形的最小面积。 用f[k][i][j]f[k][i][j]表示x轴方向上长度为k的区间,北方向上放i个矩形,南方向上放j个矩形的最小面积。 可以得到下面的dp方程 g[i][j]=min(g[i'][j−1]+(i−i')2K2)g[i][j]=min(g[i′][j−1]+(i−i′)^2K2) f原创 2017-05-03 13:28:20 · 567 阅读 · 3 评论 -
bzoj1860: [Zjoi2006]Mahjong麻将
传送门 动归。 设f[i][j][k][0/1]表示处理完前i张,i-1位置上剩j张,i剩k张,有无对子出现是否可行。 转移枚举出2对子,3对子,4对子还是顺子。const len=100;var f,g:array [-5..105,-5..105,-5..105] of boolean; a:array [-5..105] of longint; n,t,i,j,k:long原创 2017-06-28 21:24:05 · 432 阅读 · 0 评论 -
bzoj1766: [Ceoi2009]photo
传送门 跪Claris神犇。 首先得到状态f[i][j][k]表示在i到j的区间内高度大于k的最小矩形数目。 然后就两种转移:分割线或者放尽量大的新矩形。#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespa原创 2017-06-08 20:51:04 · 642 阅读 · 0 评论 -
bzoj1820: [JSOI2010]Express Service 快递服务
传送门 首先得到DP状态f[i][j][k][l]前i七询问,三辆车在j,k,l的最优值。 但是三辆车中必定有一辆在上一次的收件处,所以压掉1维。 然后我们还可以在将空间滚掉1维,这样子就可以卡进内存了。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#inc原创 2017-06-20 21:59:18 · 272 阅读 · 0 评论 -
bzoj1399: Win
传送门 根据数据范围我们推断算法是爆搜or状压dp 然后看着爆搜比较假,就去打dp了。 首先我们发现每个人挂掉的顺序可以看成一颗树 我们大力计算出树的高度,然后dp 设f[i][j][k]表示当前树的最大深度是k,选取的子集是j,胜利者是i的方案数 然后我们每次大力枚举子集dp就可以了 然后你就愉快的TLE了。 你需要卡一下常数才能过嘿嘿嘿#include<bits/stdc++.h原创 2017-07-27 21:39:09 · 400 阅读 · 0 评论 -
bzoj1945: [Ceoi2007]Royaltreasury
传送门 裸的树形dp。 f[i][0/1]表示当前位置没用/用了 转移暴力就可以了 然后就是喜闻乐见的高精度模板了。#include<cmath>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define N 1005原创 2017-07-26 21:19:39 · 412 阅读 · 0 评论 -
bzoj1939: [Croatian2010] Zuma
传送门 看英文题解的辣。上图: 翻译过来是: f[i][j][k]表示消除第i个到第j个珠子,且第i个珠子前面有k个同色珠子的最优解。 有三种转移: 1.插入一个:f[i][j][k]=f[i][j][k-1]+1 2.k=K-1时在前面插入之后消掉:f[i][j][k]=f[i+1][j][0]; 3.消除中间一段后和前面合并。要求两段同色: f[i][j][k]=f[原创 2017-07-26 21:04:20 · 577 阅读 · 0 评论 -
bzoj1933: [Shoi2007]Bookcase 书柜的尺寸
传送门 S前面那一坨就是max(hi) 然后就是大力dp 设f[i][j][k]表示前i本书,第一层长度和为j,第二层长度和为k的最小第三层长度。 显然可以滚掉一维 转移十分简单。#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cstdlib原创 2017-07-23 17:14:38 · 370 阅读 · 0 评论 -
bzoj1911: [Apio2010]特别行动队
传送门 首先得到转移方程: f[i]=max(f[j]+a*(sum[i]-sum[j-1])^2+b*(sum[i]-sum[j-1])+c) 然后我们斜率优化一发: 如果j>k且j比k更优 f[j]-f[k]+a*sum[j]^2-a*sum[k]^2+b*(sum[k]-sum[j])>2*a*(sum[j]-sum[k])*sum[i] 然后……….就没有了#include<io原创 2017-07-09 21:59:23 · 202 阅读 · 0 评论 -
bzoj1910: [Ctsc2002] Award 颁奖典礼
传送门 首先一个很显然的状态:f[i][j][k][0-2]表示在第i行左边界是j右边界是k,现在在上面/中间/下面的最优解 然后我们大力枚举边界的时间复杂度是O(N^5) 然后我们大力前缀和有话就变成了O(N^3)uses math;var a:array [0..205,0..205] of longint; f:array [1..3,0..205,0..205,0..205]原创 2017-07-09 21:53:38 · 290 阅读 · 0 评论 -
bzoj1867: [Noi1999]钉子和小球
传送门 大力dp 首先的到状态: 小球落在第i行第j个钉子上的概率。 然后得到转移: f[i+2][j+1]+=f[i][j](i,j没钉子) f[i+1][j],f[i+1][j+1]+=f[i][j]/2(i,j有钉子)“` type arr=array [1..2] of int64; var a:array [-1..55,-1..55] of char; f:a原创 2017-07-05 21:51:44 · 264 阅读 · 0 评论 -
bzoj1864: [Zjoi2006]三色二叉树
传送门 大力建出树后大力dp 设f[i][j]表示以i为根节点,根节点颜色为j是的最优解。 每次枚举当前结点节点颜色和儿子颜色, 时间复杂度O(N*27)uses math;var a,b:array [0..500005,1..3] of longint; c:array [0..500005] of longint; s:ansistring; n,p:longint;原创 2017-07-05 21:41:53 · 256 阅读 · 0 评论 -
bzoj1802: [Ahoi2009]checker
传送门 如果两个1之间不相邻, 那么第一问是偶数位上0的个数,否则是偶数位上1的个数。 否则就存在有连续1的情况 这种情况下,两个连续的1就可以到达任何一个位置,所以是不需要提前放置棋子的。 第二问先找到连续区间,对于每个连续区间向左向右判断其最少值 注意:如果第一和第二位置为1是不能算计第二种情况下的#include<cstdio>#include<cstdlib>#include原创 2017-06-13 21:17:12 · 484 阅读 · 0 评论 -
bzoj1801: [Ahoi2009]chess 中国象棋
传送门 dp。 首先一条线上最多能有两个炮。 然后发现任意两个拥有相同个炮的列等价。 得到状态f[i][j][k]表示前i行,在1到i-1行中有j列没有炮,k列有一个炮的方案总数。 转移大力人脑枚举不虚。#include<cstring> #include<cmath> #include<cstdio> #include<iostream> #include<cstdli原创 2017-06-13 21:09:16 · 308 阅读 · 0 评论 -
bzoj1925: [Sdoi2010]地精部落
传送门 我们设f[i][j]表示前i个数,第i个数排名是j的方案总数。 我们可以强制第1个数是山峰。然后我们可以将整个序列高度取反,得到其他的方案数。 然后我们发现这样做的时间复杂度是O(N^3)的 加上前缀和优化就是O(N^2)了var f:array [0..1,0..5005] of longint; n,i,j,x,p:longint;begin read(n,p);原创 2017-07-13 21:34:29 · 308 阅读 · 0 评论 -
bzoj1851: Pku2759 Distributing tasks
传送门 显然二分答案,考虑如何验证 首先覆盖方案一定是可以分成若干个不能再分割的小的宽度为2的矩形的。 我们可以用two pointerO(N)求出这个点最多向左的个数。 然后分两种情况: 1.一个人做两行。 2.一群人做第一行,另一群做第二行。 这样子时间复杂度是O(N*M)的(最多跳M次) 总时间复杂度O(N*M*logAi)#include<cmath>#include<cs原创 2017-06-24 21:35:01 · 344 阅读 · 0 评论 -
bzoj1799: [Ahoi2009]self 同类分布
传送门 因为模数最多只有9*17=163,所以我们暴力悲剧模数。 然后就是dp辣。 设f[0/1][i][j][k]表示填了前i位,和是j,数字对mo取模的值是k,前边的数字是否前部和上限相同(0)的方案数。 xjb转移一下就行了。 开心的刷到第一页。#include<cmath>#include<cstdio>#include<cstring>#include<iostream>原创 2017-06-12 21:28:08 · 285 阅读 · 0 评论 -
bzoj1794:[Ioi2008]Linear Garden
传送门 将两种植物化作1和-1 发现后缀只会出现0,1,-1,2,-2 二进制压位存状态。 然后大力状压dp驶过。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<cstdlib>using namespace std;int n,mo,c,原创 2017-06-12 21:10:54 · 567 阅读 · 0 评论 -
bzoj1831: [AHOI2008]逆序对
传送门 首先,在-1的位置上的数不会减少 假设有i#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#define N 10005using namespace std;int a[N],b[N],big[N][105],g[N原创 2017-06-22 21:21:55 · 226 阅读 · 0 评论 -
bzoj1786: [Ahoi2008]Pair 配对
传送门 首先要YY出一个性质:在-1处天的数单调不减。 很显然,大的数放前面,小的数放后面逆序对增多。 然后f[i][j]表示前i个-1,第i个-1上填的数字是j的最优解。 转移自己YY以下九可以了。“`includeincludeincludeincludeincludeincludedefine ll long longusing namespace std; int a[10005]原创 2017-06-09 21:08:37 · 334 阅读 · 0 评论 -
bzoj1499: [NOI2005]瑰丽华尔兹
传送门 一个很显然的O(nmT)的做法就是令f[t][i][j]表示时刻t时,钢琴位于(i,j)处时,从时刻1到t的最长滑行路程。很容易得到DP方程 f[t][i][j]=maxf[t−1][i][j],f[t−1][ilast][jlast]+1f[t][i][j]=max{f[t−1][i][j],f[t−1][ilast][jlast]+1} 这样做显然太慢,由于钢琴的移动方向是在一段一原创 2017-05-02 15:54:05 · 366 阅读 · 0 评论 -
bzoj1569: [JSOI2008]Blue Mary的职员分配
传送门 比较迷的dp。 设f[i][j][k][l]表示有i个员工,j的软妹币,k的荣誉,上次贴小广告是l天前最少要几天。 转移是枚举几个员工赚软妹币,另外的刷荣誉。 然后判断一下是否贴小广告。 转移比较麻烦。#include<cstring>#include<cmath> #include<cstdio> #include<iostream> #include<cstdl原创 2017-05-10 20:42:30 · 475 阅读 · 0 评论 -
bzoj1087: [SCOI2005]互不侵犯King
传送门 裸的状压dp 这一行状态只与上一行状态有关。 暴力O(2^2n)推转移式子。 暴力转移水过。 打表好像也行var f,g:array [0..605,0..605] of int64; dp:array [0..11,0..100,0..605] of int64; a:array [0..10] of longint; ans:int64; n,p,i,j,k原创 2017-03-30 21:27:13 · 289 阅读 · 0 评论 -
bzoj1207: [HNOI2004]打鼹鼠
传送门 按照时间排序 f[i]表示打死第i只鼹鼠是最多打死几只鼹鼠。 暴力转移M^2不虚。 然后就过了。var a,b,c,f:array [0..10005] of longint; n,i,j,ans,m:longint;begin read(m,n); for i:=1 to n do read(a[i],b[i],c[i]); for i:=1 to n do原创 2017-04-08 15:46:22 · 356 阅读 · 0 评论