
DP动态规划
Mys_C_K
人生有许多道:曾经踏足的是道,即将踏往的也是道,那什么才是道呢?唯有脚下走的才是道。一切精神或者物质都归于虚无,然后从混沌中衍生出三万道。在悲喜间涉足一条无数前人经历过,且将有无数后人奔赴的道,无论是否已经或者将要到达彼岸,然后便不再回头或是左顾右盼,即使有些道繁盛至极,夜灯如昼,无数人一浪又一浪的涌去,造就了世人皆知的辉煌;即使有些道草木凋敝,荒草丛生,只等勇敢的开拓者斩开荆棘,创造一片天地;这些都无所关,无所在意,彼岸何如、来日何方甚至过往旧事都化作一缕云烟,飘渺碧霄,我自撷高山之月色,独随足落处往行。
展开
-
POJ 2355 Railway tickets
POJ 2355 Railway ticketstyvj3317 / vijos 火车票这个题非常简单的DP,但是要注意不要读错题,是两个站台之间只允许买一张票的……开始读错题了WA了两次……dp方程是显然的,dp[i]表示从s开始到第i个站台最小花费则:dp[i]=min{dp[k]+cost(k,i)},s边界条件:dp [ s ] = 0 . 其中cost函数原创 2017-03-08 12:37:39 · 662 阅读 · 0 评论 -
vijos1037 搭建双塔-状态优化dp
传送门题目大意:自行参考题解:这个题非常适合初学者思考!!!建议不要看题解,先想一想基本方法,在一步步优化。好我开始说。我们先只考虑“能否达到”的问题(因为一开始我是从ppt上看的,ppt上没有说让你求最大高度)。首先第一眼是不是01背包可行性问题?然后发现这有个问题,就是你并不能保证每个物品最多只用来建了一座塔,想想为啥。然后改成dp[n][m1][m2]表示原创 2017-05-25 20:11:27 · 501 阅读 · 0 评论 -
HDU 2089 不要62-数位DP-学习笔记
吐槽这个题各种特判!简直比后缀数组还难写!(尽管还未写过后缀数组……)所幸1A了……要不调试都懒得调试时间复杂度是O(logN),以10为底,这意味着复杂度近乎O(1)……题目链接:右转进入题目题目大意:给定[l,r],问其中有多少个数字不包含4和连在一起的62?很明显就是数位DP嘛为了学习数位DP,我们先看一个简单题:给定[l,r],问其中有多少个数字?学长我原创 2017-05-07 16:51:40 · 409 阅读 · 0 评论 -
[SDOI2010]BZOJ 1924所驼门王的宝藏-强连通分量-缩点-拓扑排序-dp
题目链接:右转进入题目题目大意:自行参考题目题解:tarjan缩点后拓排一下dp乱搞即可。代码://BZOJ 1924//SDOI 2010#include#include#include#include#include#include#include#define MAXN 100010#define MAXRC 1000010using namespace s原创 2017-04-25 16:59:18 · 536 阅读 · 0 评论 -
POJ3211 Washing Clothes - 状态优化dp
传送门这个题类似上一个题类似,发现各个颜色独立分别来求。然后发现这个良心的题用时之和是一定的,差越小越好。所以用dp[n][m]表示前n件差为m-sigma{k}的时候是否可行。则找一个离sigma{k}最近的m使得dp[n][m]=true即可。此时返回答案m/2。1A好评。代码://POJ 3211 #include#include#include#incl原创 2017-05-25 21:54:03 · 307 阅读 · 0 评论 -
noip2006 金明的预算方案 - 多重背包
请自行搜索题目。题解:把每个主件和两个附件看成一个组合,只有4种选择方案,大力枚举即可。1A好评。代码://luogu P1064//noip2006提高组第二题 #include#include#include#define list liiiiist#define MAXN 100#define MAXM 33000using namespace std;int原创 2017-05-26 21:42:13 · 555 阅读 · 0 评论 -
vijos1426 兴奋剂检查 - 动态规划
传送门题目大意:略。题解:把五位状态用类似进制位的思想压缩成一位即可,注意细节。代码://vijos 1426#include#include#include#define up upppppuuup#define rep(i,s,t) for(int i=s;i<=t;i++)#define per(i,t,s) for(int i=t;i>=s;i--)#define原创 2017-05-26 21:45:01 · 376 阅读 · 0 评论 -
POJ2184 奶牛展览 - 动态规划
传送门题目大意,给定有序二元组{(sn,fn)}求一个子序列使得sigma{si}>=0,sigma{fi}>=0且使得sigma{si+fi}最大。题解:两种做法,一种是ppt上的,就是用dp[n][a]表示考虑了前n组,当前s的和为a时,f的最大值。这个转移显然。但是并不会。借鉴vijos《搭建双塔》这个题,我想的是用dp[n][d]表示前n组种,s-t的差为d时sigma原创 2017-05-26 21:48:41 · 502 阅读 · 0 评论 -
vijos1476 旅游规划-动态规划
传送门题解:我是这么做的,首先第一遍求出每个点向下的不相交的最长链和次长链,这样两条链拼起来就是就是过这个点(不包含他的父亲的情况下)的最长链。在这些最长链中取max就可以得到直径。然后一个点在直径上,要么他本身就在已经求出的最长链上(就是从这个点出发的最长+次长链=直径长度),要么如果这个点在某一条直径的某条链上(即这个点向父亲方向延伸的最长+这个点向下的最长=直径长度)原创 2017-05-26 21:56:40 · 687 阅读 · 0 评论 -
codevs1378 选课-树形dp
传送门题目大意:自行参考题解:简直就是《金明的预算方案》的加强版QwQ这个题神就神在,我们可以把一颗子树看作一个物品,只不过这个物品的体积和价值不固定。由于这个题福利子树的体积=子树的大小。所以可以认为子树的价值是一个关于子树大小的函数。这样就强行把它想象成一个背包来做。只不过不是处同意以上分配固定的体积,而是转移的时候还要枚举分配给第i颗子树多大的体积。如果就这么原创 2017-05-26 22:06:51 · 470 阅读 · 0 评论 -
POJ3016 K-Monotonic DP-左偏树
题目链接:右转进入题目题目大意:给定N个整数,将Ai修改成Bi的代价时|Ai-Bi|。现在将这N个整数划分成连续的K段,使得每一段单调递增或者单调递减(注意是严格增减)。问最小代价和。题解:很明显是DP。用dp[n][k]表示答案,那么有dp[n][k]=max{dp[p][k-1]+cost(p+1,n)},1cost数组的计算就是n遍BOI的那个数字序列题,见前面的一篇bl原创 2017-04-26 21:08:23 · 550 阅读 · 0 评论 -
[AHOI2009] BZOJ2431 逆序对数列-动态规划-前缀和优化
传送门题目大意:求逆序对数为k的长为n的排列有多少?n,k题解:这显然是个DP(废话)而且dp[n][k]表示长为n逆序对数为k的方案数。而且状态转移显然要从dp[n-1][...]推过来。考虑如果把n插入到1~(n-1)的某个逆序对数为x的排列的第p个数的后面,那么会新产生(n-1)-(p+1)+1=n-p-1对新的逆序对,其中0因此如果当前状态dp[n][k],那么原创 2017-05-19 19:40:48 · 751 阅读 · 0 评论 -
BZOJ4300 绝世好题
传送门题目大意,给定n,{an},求a的一个最大子序列bn,使得bi&b(i-1)!=0.求最大的|b|题解:显然是DP,状态转移方程显然是dp[n]=max{dp[k]+1},a[n]&a[k]!=0考虑优化,发现和LIS有点类似。LIS有个线段树优化就是暴力的记录最后的数字(显然是最大的)对应的最长的序列是多长,这样离散化一下每次询问前缀最大值。这个题的优化类似,发现a&b原创 2017-05-19 20:47:01 · 1016 阅读 · 0 评论 -
BZOJ3036-绿豆蛙的归宿-概率与期望-DP
传送门题解:略。printf("%.2f")是四舍五入么QwQ//BZOJ 3036 #include#include#include#include#define MAXN 100010using namespace std;struct node{ int to,val; node(int _to,int _val) { to=_to; val=_val原创 2017-05-20 12:12:41 · 476 阅读 · 0 评论 -
[SCOI2005] BZOJ 1088 扫雷-状压dp
传送门题目大意:略。题解:大佬们好多花式做法。一开始想的直接递推发现推不出来。(后来看了网上一个人的题解发现可以直接递推)想了想发现推不出来的原因是,一方面第二列的第i行对第一列的第i+1行有影响要记录,而且不记录“轮廓”的话会有重复计数。注意到一个格子周围的“轮廓”长度是3,因为再大就影响不了了,因此可以状压dp,这样就可以保证不会有重复了。以上是我的做法。原创 2017-06-16 20:23:44 · 515 阅读 · 0 评论 -
BZOJ3450 Easy-概率与期望-递推
传送门题目大意:给定一个01序列,其中有某些字符未知(记为?),是0或1的概率相等,各50%。序列的值定义为序列中极长的0序列的长度的平方的和。求期望值。解:一看概率题想递推。记f[i]为到第i位,期望值是多少。那么如果第i位是0,那么f[i]=f[i-1]+(第i位是0的贡献)。在f[i-1]的基础上,第i位是0对f[i]的贡献,显然就是(到第i位的极长0序列的长度)^2原创 2017-05-21 16:18:50 · 735 阅读 · 0 评论 -
[NOI2005]BZOJ1415 聪聪和可可
传送门题解:这个题,开始本着拿50分去写,结果写完了在vijos和tyvj上提交竟然都得了80分而且速度好像都很快,然后调试了一些奇怪的bug(坑),就AC了。事后又想了几分钟才想明白复杂度为什么是对的QwQ我真是太弱辣自己写的正解都不知道QAQ首先,按照题意预处理dist[i][j](就是i,j的距离),to[i][j]表示从i到j下一步要走的编号最小的点。然后dp[s][t原创 2017-05-21 21:45:25 · 409 阅读 · 0 评论 -
[HAOI2005]BZOJ1055 玩具取名 - 动态规划
传送门题解:令f[i][j][k]表示i到j这段区间能否用k来演变出来。然后,没了#include#include#include#include#define MAXN 210#define MAXK 5using namespace std;bool f[MAXN][MAXN][MAXK],to[MAXK][MAXK][MAXK];char s[MAXN];int原创 2017-06-24 21:10:08 · 513 阅读 · 0 评论 -
[ZJOI2006]BZOJ 1003 物流运输 - 最短路 - dp
传送门这个题想明白了还是还是非常的,就是注意到对T天分为若干段,每段的费用一定选择可行最短路。然后就是dp,没了。//ZJOI 2006//BZOJ 1003#include#include#include#include#include#include#define INF (LLONG_MAX/3)#define MAXN 30#define MAXT 11原创 2017-06-26 18:55:12 · 555 阅读 · 0 评论 -
[SCOI 2009]BZOJ 1026 windy数 - 数位dp
传送门题目大意:自行参考。题解:设dp[i][j][2][2][2]表示考虑到第i位,数字是j,是否紧贴上界,历史上是否存在一个差小于2,以及这i位是否全部为0.为什么要记录最后一个“是否全部为0”呢?原因是如果前i位全部为0那么第i+1位无论是什么数都满足要求;否则如果第i位是0但是前i-1位不全为0那么意味着第i+1位只能是2及以上。注意到如果前i位都是0的话那么历原创 2017-06-15 08:18:34 · 511 阅读 · 0 评论 -
vijos 1240 朴素的网络游戏 dp
传送门题目大意:自行参考。题解:这种dp题真是太神奇啦!我指的是这种需要先对题目进行第一印象的分析。首先注意到,如果有两个房间住了两对夫妻,那么换成两个房间分别住了两男和两女答案不会变差。因此一定有一种最优解使得只有一对夫妻住在一起。因此另dp[2][n][m][f]表示有无夫妻/考虑了n间房间/两性人数为m和f。O(1)转移即可。注意细节处理。一个类似原创 2017-06-15 10:22:49 · 443 阅读 · 0 评论 -
POJ 1849 Two - dp
传送门题目大意:自行参考题解:exm???如果必须回到根结点那么答案就是边权之和的两倍。注意到两个人肯定是走到叶子结点,这样就少走了两人之间的链长的距离。所以要最大化链长,所以就是求直径。答案就是边权之和的两倍减去直径长度即可。代码:#include#include#include#include#define MAXN 100010using nam原创 2017-06-15 10:55:11 · 371 阅读 · 0 评论 -
BZOJ3329 Xorequ - 结论题 - 数位dp - 矩阵乘法
传送门题目大意:请自行参考。题解:首先这个式子等价于x^2x=3x,由于异或是不进位加法,不进位还想等了只能说明没有进位进而可以推知等价于x的二进制中没有相邻的1.因此第一问二进制拆分后做数位dp即可。第二问随便列一列式子就可以矩乘了。代码:#include#include#include#include#define mod 1000000007#define li原创 2017-07-16 20:31:08 · 419 阅读 · 0 评论 -
[HNOI2008]BZOJ1009 GT考试 - 动态规划 - 矩阵乘法 - KMP
传送门题解:首先一开始并没有意识到这个题根KMP有9毛钱关系,只是以为如果设状态为:f[i][j]表示当前考虑到第i位,且有j位是B的前缀,那么如果下一位是B的j+1位那么就可以转移到f[i+1][j+1],否则转移到f[i+1][0]。后来发现我真是个智障。f[i][j]的j能转移到哪里,计算类似于KMP算法,我们枚举第j+1位是什么转移,转移到哪就在矩阵上+1。要特判一原创 2017-07-16 20:30:43 · 418 阅读 · 0 评论 -
BZOJ2435 守卫者的挑战 - 期望dp
传送门题解:考虑dp。dp[i][j][k]表示当前第i场,已经赢了j场,背包容量为k(可能为负)的概率。转移显然。可以用n+1表示背包容量无穷大(因为显然碎片最多n个,容量太大就变成无穷大了)。代码:#include//BZOJ 3029#include#include#define MAXN 210using namespace std;double dp[原创 2017-08-02 20:42:41 · 427 阅读 · 0 评论 -
BZOJ3398 牡牛和牝牛 - 动态规划
传送门题解:沙茶题。前缀和维护一下。这题显然可以再O(k+lgn)的时间内出解。代码:#include#include#include#define mod 5000011#define N 100010using namespace std;int dp[N],s[N];int main(){ int n,k;scanf("%d%d",&n,&k);原创 2017-08-02 20:49:06 · 750 阅读 · 0 评论 -
vijos 1417 魔法塔防 - DP
传送门题解:显然红塔放在最后。dp[i][j]表示前i座塔放了几个绿塔,剩下的放红塔。这样是O(n^2)的。此题显然可以做到O(gb+n)的复杂度。可以通过形如n发现可以优化空间。//vijos 1411#include#include#include#include#define lint long long#define N 1100using nam原创 2017-08-03 20:14:46 · 446 阅读 · 0 评论 -
vijos 1471 教主的游乐场 - 线段树优化dp
传送门题解:首先这个题可以n遍bfs。然后发现dp只记录一维状态不够,因为可能有环,不满足dp性质。解决方案有如下两种:1.于是找性质,发现非常有意思的一点是每个点可以向前跳到任何一个点。考虑一条最优解路径,如果先向右跳了一步,然后又向左跳了一步,那么不如直接向右/左跳一步。也就是最优解至多在第一次跳是向左的。因此可以先处理一个点只往右跳的答案,这个显然可以用线段树维护原创 2017-08-04 19:53:05 · 582 阅读 · 1 评论 -
vijos 1283 佳佳的魔杖 - 前缀和优化dp
传送门题解:不知道他们怎么看出是LCS的。首先考虑转化成图,选了[l,r]就不能选择[s,t],l所以可以用网络流做最小割,也可以在这张无环图上做dp,但是边数是O(n^4)的。发现如果左端点相同至多只会选择一根。考虑dp,记dp[l][r]表示选了[l,r]选了左端点最靠左的区间为[l,r](当然有可能不合法,此时记为0)这样dp[l][r]是从dp[s][t]转移而原创 2017-08-04 21:11:00 · 588 阅读 · 0 评论 -
vijos 1421 更换轮胎 - 前缀和优化dp
传送门题解:和上一个题一样强迫症晚期必须做到O(n)空间代码://vijos 1421#include#include#include#include#include#define INF (LLONG_MAX/2)#define N 1010#define lint long longusing namespace std;lint dp[2][N],pre[原创 2017-08-04 21:32:53 · 687 阅读 · 0 评论 -
BZOJ1725 Corn Fields牧场的安排 - 状压dp
传送门题解:傻逼题#include#include#include#include#define N 13#define MAXT 380#define mod 100000000using namespace std;inline int updv(int &x,int p){ return x|=(1<<(p-1));}inline int getv(原创 2017-08-26 19:44:43 · 389 阅读 · 0 评论 -
[SCOI2005] BZOJ 1087 互不侵犯King - 状压dp
传送门题解:首先求出哪些行的状态是合法的,即没有相邻的棋子。发现合法的行状态数量只有90,没有2^9=512这么多。然后枚举相邻两行,预处理能否转移。然后记q[i]表示第i种合法的行方案是q[i],cnt[i]表示q[i]放了多少个棋子然后记dp[i][j][k]表示前i行第i行状态为j棋子个数是k的方案数转移枚举哪些状态可以转移(刚才预处理过的)然后……就没有然后原创 2017-08-26 19:41:32 · 369 阅读 · 0 评论 -
BZOJ 1231 mixup2 混乱的奶牛 - 状压dp
传送门题解:傻逼题#include#include#include#include#define lint long long#define N 17using namespace std;int n,all,a[N];lint dp[1<<N][N];inline int getv(int x,int p){ return (x&(1>(p-1);}inl原创 2017-08-26 19:48:10 · 359 阅读 · 0 评论 -
BZOJ 1688 Disease Manangement 疾病管理 -状压dp
传送门题解:傻逼题#include#include#include#include#include#define inf (INT_MIN/2)#define N 1010#define D 16using namespace std;inline int getv(int x,int p){ return (x&(1>(p-1);}inline i原创 2017-08-26 19:50:07 · 582 阅读 · 0 评论 -
[SCOI2007] BZOJ 1072 排列perm - 状压dp
传送门题解:dp数组记录当前数字和%d以及用了哪些数字#include#include#include#define N 11#define D 1010using namespace std;int fac[10],b[10];char s[N];int dp[1<<N][D],a[N];inline int toi(char ch){ return ch^'0原创 2017-08-26 19:52:46 · 378 阅读 · 0 评论 -
一道神奇的树形dp题
题目大意:给定n,m,对于1~n中的每一个k,求有k个叶子结点且满足以下性质的二叉树的个数:1)一个点要么是叶子结点,要么有左右儿子。2)从根出发的任意一条路径上,向左的边不超过m次。对998244353取模。n,m<=5000。题解如下:首先容易想到dp[x][y]表示x个叶子最远向左走y次的方案数,然后转移枚举左边子树的叶子个数,用容斥剪掉重复计算部分。发现这个转...原创 2017-09-26 07:28:30 · 485 阅读 · 0 评论 -
[学习笔记]概率与期望dp做题总结
之前做的一些就不记录了,只记录现在开始做的一些题。T0. 入门题给一个有向无环图,每次等概率走某一条边,求从1走到n的边权和的期望。做法1,直接设dp[x]表示答案,转移显然。做法2,考虑从定义入手分析出一种做法。期望的定义是E=sigma Pi*Wi,就是Wi出现的概率乘上他自己。本题中即Answer(G) = simga { P(p_i)*W(p_i) },p_i表示一条路原创 2017-10-25 14:25:37 · 974 阅读 · 0 评论 -
Good Bye 2017 D.New Year and Arbitrary Arrangement - 数学
题目大意:你有一个随机数生成器,有p的概率生成字符a,(1-p)的概率生成b。给定p=u/v,k,当生成的字符串中有至少k个形如’ab’的子序列(注意不是子串,例如abaab有4个形如’ab’的子序列)的时候就停止。不难注意到,停止的时候显然可能有多于k个形如’ab’的子序列。现在求期望情况下停止的时候有多少个形如’ab’的子序列。 k<=1000。答案对大质数取模输出。题解:显然考虑dp……原创 2017-12-30 02:15:06 · 425 阅读 · 0 评论 -
codeforces 917B MADMAX 拓扑排序 - 动态规划 - 博弈论
传送门 题目大意:给你一张有向无环图,边权是字母。 对于每一对(s,t),按照如下规则,求当第一个人在s第二个人在t的时候谁有必胜策略。规则是,两人轮流移动,每次移动的边权不能小于上一次移动的边权。不能移动的人输。n题解:DAG,考虑dp。两个人博弈论,考虑令f[x][y][c]表示第一个人在x第二个人在y上一次边权是c,当前是第一个人要走,能否赢。g同理,表示第二个人。按照拓扑序转移即可。原创 2018-01-30 20:40:06 · 576 阅读 · 0 评论 -
Atcoder Regular 058 E - 和風いろはちゃん / Iroha and Haiku - 状压
题目大意:问有多少长度为N的数列{aN},满足每个数字权值在[1,10]中,并且不存在1#include#include#include#define lint long long#define LOG 17#define maxK 10#define V 1#define N 42#define mod 1000000007using namespace std;inli原创 2018-02-05 15:38:00 · 675 阅读 · 0 评论