dp
SC.ldxcaicai
我很菜=_=
展开
-
2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)
传送门 一道斜率优化dp入门题。是这样的没错。。。我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二个地址为j,则有total=[∑ni=1dis[i]∗w[i]]−dis[i]∗w[i]−dis[j]∗(sum[j]−sum[i])total=[∑i=1ndis[i]∗w[i]]−dis[i...原创 2018-08-28 14:10:20 · 232 阅读 · 0 评论 -
2018.08.29 hdu3507 Print Article(斜率优化dp)
传送门 这应该算是斜率优化的模板题了。 就是要求打印n个数,每个数有一个参数a[i],每打印一段连续的数[l,r]需要的花费是(a[[l]+...+a[r])2+m(a[[l]+...+a[r])2+m(a[[l]+...+a[r])^2+m,要使得打印出所有数的代价最小。 用dp[i]表示打印1~i用的最小代价,显然有dp[i]=min(dp[j]+m+(sum[i]−sum[j−1])2...原创 2018-08-29 23:35:27 · 105 阅读 · 0 评论 -
2018.09.07 codeforces311B. Cats Transport(斜率优化dp)
传送门 斜率优化dp好题。 对于第i只猫,显然如果管理员想从出发开始刚好接到它,需要在t[i]=h[i]−dist(1,i)t[i]=h[i]−dist(1,i)t[i]=h[i]-dist(1,i)的时候出发才行。 这样的话,如果把第l~r只猫分成一组,那么当前分组需要的最小花费是 t[r]−t[l]+t[r]−t[l+1]+t[r]−t[l+2]+...+t[r]−t[r]=t[r]∗...原创 2018-09-07 20:21:58 · 280 阅读 · 0 评论 -
2018.09.07 bzoj1911: [Apio2010]特别行动队(斜率优化dp)
传送门 斜率优化dp经典题。 题目中说的很清楚,设f[i]表示前i个数分配出的最大值。 那么有: f[i]=max(f[j]+A∗(sum[i]−sum[j])2+B∗(sum[i]−sum[j])+C)f[i]=max(f[j]+A∗(sum[i]−sum[j])2+B∗(sum[i]−sum[j])+C)f[i]=max(f[j]+A*(sum[i]-sum[j])^2+B*(sum[...原创 2018-09-07 21:02:34 · 160 阅读 · 0 评论 -
2018.09.07 bzoj1096: [ZJOI2007]仓库建设(斜率优化dp)
传送门 斜率优化dp经典题。 令f[i]表示i这个地方修建仓库的最优值,那么答案就是f[n]。 用dis[i]表示i到1的距离,sump[i]表示1~i所有工厂的p之和,sum[i]表示1~i所有工厂的p*dis之和。 那么有状态转移方程: f[i]=min(f[j]+dis[i]∗(sump[i−1]−sump[j])−(sum[i]−sum[j])+c[i])f[i]=min(f[j...原创 2018-09-07 21:44:41 · 202 阅读 · 0 评论 -
2018.09.07 Amount of degrees(数位dp)
描述求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的B的整数次幂之和。 例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 17 = 24+20, 18 = 24+21, 20 = 24+22。输入第一行包含两个整数X和Y。接下来两行包含整数K和B。 输出只包含一个整数,表示满足条件的数的个数。样例输入...原创 2018-09-07 23:56:17 · 291 阅读 · 0 评论 -
2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)
传送门 dp好题。 每一天要变更路线一定还是走最短路。 所以l~r天不变更路线的最优方案就是把l~r天所有不能走的点都删掉再求最短路。显然是可以dp的。 设f[i]表示第i天的最优花销。那么我们枚举在哪里切换路线更优,则有状态转移方程: f[i]=min(f[j]+spfa(j,i)∗(i−j)+k)(j=1...i−1)f[i]=min(f[j]+spfa(j,i)∗(i−j)+k)(...原创 2018-09-02 15:13:08 · 132 阅读 · 0 评论 -
2018.09.02 bzoj1025: [SCOI2009]游戏(计数dp+线筛预处理)
传送门 要将所有置换变成一个轮换,显然轮换的周期是所有置换长度的最小公倍数。 于是我们只需要求长度不超过n,且长度最小公倍数为t的不同置换数。 而我们知道,lcm只跟所有素数的最高位有关。 因此lcm=∏iprimeipi∏iprimeipi\prod _i {prime_i}^{p_i} 。 于是我们可以定义状态f[i][j]表示前i个素数凑出的和为j的方案数。 这个可以用类似于背包...原创 2018-09-02 15:52:05 · 126 阅读 · 0 评论 -
2018.09.02 bzoj1296: [SCOI2009]粉刷匠(dp套dp)
传送门 dp好题。 先推出对于每一行花费k次能最多粉刷的格子数。 然后再推前i行花费k次能最多粉刷的格子数。 代码:#include<bits/stdc++.h>#define N 55#define T 2505using namespace std;int n,m,t,sum[T],f[T][T],g[T][T],ans=0;char s[N];int ...原创 2018-09-02 17:03:42 · 144 阅读 · 0 评论 -
2018.09.05 任务安排(斜率优化dp)
描述这道题目说的是,给出了n项必须按照顺序完成的任务,每项任务有它需要占用机器的时间和价值。现在我们有一台机器可以使用,它每次可以完成一批任务,完成这批任务所需的时间为一个启动机器的时间S加上所有任务需要的时间。并且它是在完成所有任务后才会把任务的成果输出,这样我们就在那一时间时得到所有这些任务的一个完成时间。我们现在要求一种完成任务的方式使得所有任务的完成时间乘上该任务的价值之和最小。...原创 2018-09-05 12:02:51 · 432 阅读 · 3 评论 -
2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233。 假设n=∏iakiin=∏iaikin=\prod _i a_i^{k_i} 那么集合中合法的数一定满足: t=∏i(1/akii)t=∏i(1/aiki)t=\prod _i (1/a_i^{k_i}) 发现后面的i很小,可以状压dp一发。 然后就没了。 注意集合中有1时需要把答案乘二。 代码:#include&amp;amp;lt;b...原创 2018-10-11 23:35:50 · 154 阅读 · 0 评论 -
2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)
传送门 把式子展开后发现就是要求: m∗(∑mi=1sum′[i])−sum[n]2m∗(∑i=1msum′[i])−sum[n]2m*(\sum _{i=1} ^m sum'[i])-sum[n]^2的最小值。 于是只需要求: m∗(∑mi=1sum′[i])m∗(∑i=1msum′[i])m*(\sum _{i=1} ^m sum'[i])的最小值。 于是设f[i][j]f[i]...原创 2018-09-08 17:20:59 · 160 阅读 · 0 评论 -
2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)
传送门 显然不能直接写多重背包。 这题可以用二进制拆分/单调队列优化(感觉二进制好写)。 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+120,21,...2t,c[i]−2t+1+12^0,2^1,...2^t,c[i]-2^{t+1}+1的组合。 这样物品总个数就变成了∑log(c[i])∑log(c[i])\sum log(c[i]) 于是可以...原创 2018-09-08 19:37:13 · 159 阅读 · 0 评论 -
2018.09.08 poj1185 炮兵阵地(状压dp)
传送门 状压dp经典题。 我们把每一行的状态压成01串。 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了。 注意当前行转移要考虑前两行的状态。 还要注意只有一行的情况。 代码:#include<iostream>#include<cctype>#include<cstdio>using namespace std;...原创 2018-09-08 21:56:16 · 140 阅读 · 0 评论 -
2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)
传送门 状压dp好题啊。 可以发现这道题的状压只用压缩5位。 f[i][j]表示当前在第i个位置状态为j的最优值。 显然可以由f[i-1]更新过来。 因此只用预处理在第i个位置状态为j时有多少个小朋友高兴就行了。 代码:#include<bits/stdc++.h>#define N 50005using namespace std;int n,c,f[N][...原创 2018-09-08 23:58:41 · 269 阅读 · 0 评论 -
2018.09.05 bzoj2726: [SDOI2012]任务安排(斜率优化dp+二分)
传送门 跟TiTiT_i为正数的时候差不多。 只是这个时候timetimetime数组没有了单调性,因此不能丢弃队头的元素,我们需要维护完整的下凸壳然后在上面二分。 写的时候如果用slopeslopeslope函数算斜率好像会爆掉几个点,精度真神奇。。。 代码:#include<bits/stdc++.h>#define ll long long#define N ...原创 2018-09-05 23:27:43 · 202 阅读 · 0 评论 -
2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)
传送门 一道经典的斜率优化dp。 推式子ing。。。 令f[i]表示装前i个玩具的最优代价。 然后用老套路。 我们只考虑把第j+1j+1j+1~iii个玩具分成一组的情况,之前的1~j个自行按最优情况分组。 显然有f[i]=f[j]+(sum[i]−sum[j]+L)2f[i]=f[j]+(sum[i]−sum[j]+L)2f[i]=f[j]+(sum[i]-sum[j]+L)^2 ...原创 2018-09-05 23:56:20 · 126 阅读 · 0 评论 -
2018.09.15点名器(简单dp)
描述Ssoier在紧张的学习中,杜老师每天给他们传授精妙的知识。 杜老师为了活跃气氛,设计了一个点名器,这个点名器包含一个长度为M的数组(下标1开始),每个元素是一个oier的名字,每次点名的时候,点名器会等概论随机生成一个1到M的整数,对应的人就要回答问题。当然杜老师有喜欢的人,他会故意让一些名字重复出现以增加某些人被点中的概率。 zgs感觉不是很好,他不希望被点中。他找到杜老师,不过杜...原创 2018-09-15 18:43:24 · 571 阅读 · 0 评论 -
2018.09.09 UVa10529 - Dumb Bones(期望dp)
传送门 期望dp好题。 f[i]表示摆放i个的最小花费,于是f[i]可以从f[j]与f[i-j+1]转移过来了。 代码:#include<bits/stdc++.h>#define N 1005using namespace std;int n;double L,R,f[N];inline double min(double a,double b){return...原创 2018-09-09 23:02:20 · 157 阅读 · 0 评论 -
2018.09.09 codeforces280C. Game on Tree(期望dp)
传送门 期望dp经典题。 显然只需要算出每个点被染黑的期望步数。 点i被染黑的期望是1/(1到i这条链上的节点数)1/(1到i这条链上的节点数)1/(1到i这条链上的节点数) 于是就做完了。 代码:#include<bits/stdc++.h>#define N 100005using namespace std;inline int read(){ i...原创 2018-09-09 23:48:18 · 1243 阅读 · 0 评论 -
2018.09.10 bzoj1597: [Usaco2008 Mar]土地购买(斜率优化dp)
传送门 终究还是通宵了啊。。。 这是一道简单的斜率优化dp。 先对所有土地排序,显然如果有严格小于的两块土地不用考虑小的一块。 于是剩下的土地有一条边单增,另外一条单减。 我们假设a[i]是单减的,b[i]是单增的。 f[i]=min(f[j]+a[j+1]∗b[i])f[i]=min(f[j]+a[j+1]∗b[i])f[i]=min(f[j]+a[j+1]*b[i]) 对于两个决...原创 2018-09-10 00:32:41 · 166 阅读 · 0 评论 -
2018.09.06 烽火传递(单调队列优化dp)
描述烽火台是重要的军事防御设施,一般建在交通要道或险要处。一旦有军情发生,则白天用浓烟,晚上有火光传递军情。 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确传递,在连续 m 个烽火台中至少要有一个发出信号。现在输入 n,m 和每个烽火台的代价,请计算总共最少的代价在两城市之间来准确传递情报。输入第一行是 n,m ,表示 n 个烽火台和连续烽火台...原创 2018-09-06 23:16:57 · 636 阅读 · 0 评论 -
2018.09.06 警卫安排(树形dp)
描述太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;有边直接相连的宫殿可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。 可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。 编程任务:帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。...原创 2018-09-06 23:43:53 · 418 阅读 · 0 评论 -
2018.09.17 bzoj1260: [CQOI2007]涂色paint(区间dp)
传送门区间dp简单题啊。很显然用f[l][r]f[l][r]f[l][r]表示把区间[l,r][l,r][l,r]按要求染好的代价。这样可以O(n)O(n)O(n)枚举断点转移了啊。显然如果断开的两个点颜色相同可以省掉一次。但是注意如果[l,r][l,r][l,r]两端点相同同样可以省掉一部分代价(细节见代码)。代码:#include<bits/stdc++.h>#de...原创 2018-09-17 20:34:50 · 135 阅读 · 0 评论 -
2018.09.17 atcoder Tak and Cards(背包)
传送门背包经典题。直接f[i][j]f[i][j]f[i][j]表示选i张牌和为j的方案数。最后统计答案就行了。代码:#include<bits/stdc++.h>#define N 55#define ll long longusing namespace std;ll f[N][N*N],ans=0;int x,a,n;int main(){ f[0][0]...原创 2018-09-17 21:51:07 · 376 阅读 · 0 评论 -
2018.09.10 loj#10172. 涂抹果酱(状压dp)
传送门 三进制状压感觉有点难写啊。 不过这题状态转移方程挺简单的。 就直接f[i][j]表示前i行第i行状态为j时的选法总数,分情况转移就行了。 代码:#include<bits/stdc++.h>#define ll long long#define mod 1000000#define N 10005using namespace std;int n,m,...原创 2018-09-10 20:52:45 · 711 阅读 · 1 评论 -
2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)
传送门 单调队列优化dp好题。 有一个很明显的状态设置是f[i][j]表示第i天完剩下了j分股票的最优值。 显然f[i][j]可以从f[i-w-1][k]转移过来。 方程很好推啊。 对于j&lt;kj&lt;kjj&gt;kj&gt;kj>k的情况我们分别对第二维建立单调队列转移。 代码:#include&lt;bits/stdc++.h&gt;#defi原创 2018-09-10 21:41:36 · 198 阅读 · 0 评论 -
2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)
传送门 单调队列优化dp好题。 这题其实很简单。 我们很容易想到一个O(T∗n∗m)O(T∗n∗m)O(T*n*m)的算法,就是以时间点与坐标转移。 然后我们可以改成时间段和坐标转移。 时间复杂度O(k∗n3)O(k∗n3)O(k*n^3) 方程是: f[k][x][y]=max(f[k−1][x′][y′]+dist(x,y,x′,y′))f[k][x][y]=max(f[k−1]...原创 2018-09-10 23:45:01 · 173 阅读 · 0 评论 -
2018.09.07 loj#10166 数字游戏(数位dp)
传送门 数位dp板子题。 f[i][mod]f[i][mod]f[i][mod]表示当前进行到第i位,所有数位数字之和的余数是modmodmod时的种类数,根据当前位选择是否有限制转移就行了。 代码:#include&lt;bits/stdc++.h&gt;#define ll long longusing namespace std;ll l,r,modd,num[15],f...原创 2018-09-07 17:34:32 · 388 阅读 · 0 评论 -
2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)
传送门一道带了spj的单调队列优化dp。注意元素入队和出队的条件。代码:#include&lt;bits/stdc++.h&gt;#define N 200005using namespace std;inline int read(){ int ans=0,w=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')w=-1;...原创 2018-09-23 17:22:13 · 919 阅读 · 0 评论 -
2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)
传送门显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号。所以如何求出所有边被经过的期望次数?显然这只跟边连接的两个点有关。于是我们只需要求出两个点被经过的期望次数。对于一个点uuu,它被经过的期望次数f[u]=∑vf[v]/du[v]f[u]=\sum _v f[v]/du[v]f[u]=∑vf[v]/du[v]这是一个环上的递推式,我们可以用高斯消元解方程组。...原创 2018-09-23 19:09:23 · 135 阅读 · 0 评论 -
2018.09.23 bzoj1076: [SCOI2008]奖励关(期望+状压dp)
传送门一道神奇的期望状压dp。用f[i][j]f[i][j]f[i][j]表示目前在第i轮已选取物品状态为j,从现在到第k轮能得到的最大贡献。如果我们从前向后推有可能会遇到不合法的情况。所以我们从后向前推。这时怎么处理不合法的情况呢?如果当前这个状态不具备选择k的条件。那么说明第i+1轮可能具备。于是f[i][j]+=f[i+1][j]f[i][j]+=f[i+1][j]f[i][...原创 2018-09-23 20:15:21 · 149 阅读 · 0 评论 -
2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)
传送门 貌似贪心能过啊%%%。 本蒟蒻写的线段树优化dp。 式子很好推啊。 f[i]表示覆盖1~i所需的最小代价。 那么显然对于一个区间[li,ri][li,ri][l_i,r_i] 有f[ri]=min(f[j])+1,li−1≤j≤rif[ri]=min(f[j])+1,li−1≤j≤rif[r_i]=min(f[j])+1,l_i-1 \le j \le r_i 这样推出f[t...原创 2018-09-13 20:57:43 · 242 阅读 · 0 评论 -
2018.09.24 bzoj1867: [Noi1999]钉子和小球(概率dp)
传送门概率dp经典题。如果当前位置(i,j)(i,j)(i,j)有钉子,那么掉到(i+1,j),(i+1,j+1)(i+1,j),(i+1,j+1)(i+1,j),(i+1,j+1)的概率都是1/2。而如果没有钉子,那么掉到(i+2,j+1)(i+2,j+1)(i+2,j+1)的概率是1。这样转移就行了。另外注意读入字符要用cin。代码:#include<bits/stdc++...原创 2018-09-24 22:56:30 · 545 阅读 · 0 评论 -
2018.09.25 51nod1597 有限背包计数问题(背包+前缀和优化)
传送门dp好题。我认为原题的描述已经很清楚了:你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少。两种方案不同当且仅当存在至少一个数i满足第i种物品使用的数量不同。然而我只会O(n2)O(n^2)O(n2)的做法。然后通过搜题解学会了O(n∗sqrt(n))O(n*sqrt(n))O(n∗sqrt(n))的做法。简单讲讲。首先我们需...原创 2018-09-25 09:05:49 · 407 阅读 · 0 评论 -
2018.09.25 poj2068 Nim(博弈论+dp)
传送门题意简述:m个石子,有两个队每队n个人循环取,每个人每次取石子有数量限制,取最后一块的输,问先手能否获胜。博弈论+dp。我们令f[i][j]f[i][j]f[i][j]表示当前第i个人取石子,石子还剩下j个时能否获胜。显然如果有取法让轮到第(i+1)(i+1)(i+1) modmodmod 2n2n2n 个人有必败状态,那么的当前就是必胜状态。再令k=(i+1)k=(i+1)k=...原创 2018-09-25 10:16:42 · 223 阅读 · 0 评论 -
2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)
传送门虚树入门题?好难啊。在学习别人的写法之后终于过了。这道题dp方程很好想。主要是不好写。简要说说思路吧。显然最优值只能够从子树和父亲转移过来。于是我们先dfs一遍用儿子更新父亲,然后再dfs一遍用父亲更新儿子。这样搞完之后可以统计出每个点所属的管辖点。然后统计。但这样单次跑是O(n)O(n)O(n)的不优秀。考虑优化算法的时间复杂度。注意到所有管辖点加起来只有O(n)...原创 2018-09-25 20:02:32 · 354 阅读 · 0 评论 -
2018.09.14 洛谷P3931 SAC E#1 - 一道难题 Tree(树形dp)
传送门 简单dp题。 f[i]表示以i为根的子树被割掉的最小值。 那么有: f[i]=min(∑vf[v],dist(i,fa))f[i]=min(∑vf[v],dist(i,fa))f[i]=min(\sum _v f[v],dist(i,fa)) 直接树形dp就行了。 代码:#include<bits/stdc++.h>#define N 100005usi...原创 2018-09-14 23:41:18 · 158 阅读 · 0 评论 -
2018.09.25 bzoj2286: [Sdoi2011]消耗战(虚树+树形dp)
传送门又一道虚树入门题。这个dp更简单啊。直接记录每个点到1的距离,简单转移就行了。代码:#include&lt;bits/stdc++.h&gt;#define N 250005#define ll long long#define min(a,b) (a&lt;b?a:b)using namespace std;inline ll read(){ ll ans=0; c...原创 2018-09-25 21:48:51 · 183 阅读 · 0 评论 -
2018.10.01 NOIP模拟 偷书(状压dp)
描述在L的书架上,有N本精彩绝伦的书籍,每本书价值不菲。M是一个书籍爱好者,他对L的书籍早就垂涎三尺。最后他忍受不了诱惑,觉得去偷L的书,为了迅速完成这件事,同时他不希望L很快发现书籍少了,他决定偷书时,对于任意连续的k本书,他最多选B本,最少选A本。现在他想知道怎么选出来的书本最后使得偷的书籍的价值和,与剩下的书籍价值和,差值最大。输入第一行四个整数 n,k,a,b一行 N 个整数表示...原创 2018-10-11 23:39:30 · 442 阅读 · 0 评论