动态规划
兜率工
XJTU 硕士研究生在读
展开
-
POJ - 1699 Best Sequence (AC自动机+状压DP)
题意:给出n(n<=10)个串,每个串的长度小于等于20,计算覆盖所有串的最短串长度分析:对所有串建立fail树,那么可以发现其实是在fail树上计算一个覆盖所有节点的最短路,因为最多10个串,所以我么考虑状压DP表示到了当前状态为 i 的节点且一共走了 j 状态的串(第 k 个串走完的话标记 j 的第k位是1)那么也很容易得到状态转移方程,在树上bfs计算即可。...原创 2019-09-28 14:07:27 · 561 阅读 · 1 评论 -
CodeForces - 713C Sonya and Problem Wihtout a Legend ( DP )
题意:将给出的数组转化为单调递增的数组所花费的最小代价(代价为每个数改变的大小之和)分析:首先这个题就是POJ3666的一个变型,POJ3666是计算的非严格的单调递增先说POJ3666的解法:表示将第 i 个数转化为第 j 个数所花费的最小值,( j 所代表的是排序后有序递增的一个数组)那么 这样算下来是一个非严格的单调递增序列。因为这个题要计算的是严...原创 2019-04-10 12:52:01 · 253 阅读 · 0 评论 -
UVA - 10529 Dumb Bones (概率DP)
题意:你试图把一些多米诺骨牌排成直线,然后推倒它们。但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒,而你的工作也被部分的破坏了。 比如你已经把骨牌摆成了DD__DxDDD_D的形状,而想要在x这个位置再放一块骨牌。它可能会把左边的一块骨牌或右边的三块骨牌碰倒,而你将不得不重新摆放这些骨牌。 这种失误是无法避免的,但是你可以应用一种特殊的放骨牌方法来使骨牌更多的...原创 2018-12-20 18:46:09 · 176 阅读 · 0 评论 -
POJ - 3071 Football (概率DP)
题意:2的n次方个球队按照竞赛图踢球,给你任意两只球队之间相互赢球的概率,求最后哪支球队最可能夺冠。分析:dp[i][j]表示第 i 轮的时候,第 j 支队伍赢的概率。可得: 对于其中位运算,可以用一个二叉树来更直观的理解 (j>>(i-1))^1) 跟 (k>>(i-1)分别表示一个父节点的两个子节点,当(j>>(i-1))^1) =...原创 2018-12-20 13:08:40 · 388 阅读 · 1 评论 -
UVA - 12099 The Bookcase (DP)
题意:将n本书放入一个三层的书架,求书架的最小面积。分析:定义dp[i][j][k]为对于前i本书,第二个书架的宽度为j,第三个书架的宽度为k时书架的最小总高度,我们规定最高的书放在第一个书架。在开数组时可以省掉一维,则有转移方程: if(j>b[i].w) dp[j][k]=min(dp[j-b[i].w][k],dp[j][k]);if(j==b[i].w) ...原创 2018-11-17 15:19:03 · 195 阅读 · 0 评论 -
UVA - 1204 Fun Game (状压DP)
题意:一群小孩(至少两个)围成一圈做游戏。每一轮从某个小孩开始往他左边或者右边传手帕。一个小孩拿到手帕后在手帕上写上自己的性别,男孩写B,女孩写G,然后按照相同的方向传递给下一个小孩,每一轮都可能在任何一个小孩写完后停止,现在游戏已经进行了n轮,已知n轮中每轮手帕上留下的字,问最少可能有几个小孩。分析:定义状态dp[i][j][x]表示当前拿的字符串状态为i,最后一次拿的字符串为j,j...原创 2018-11-16 15:52:20 · 454 阅读 · 0 评论 -
UVA - 12105 Bigger is Better ( DP )
题意:给出n个木棒,摆出能被m整除的最大的数分析:有一种非常显而易见的dp方法: f[i][j]表示用i根火柴拼出的“%m是j”的最大整数 转移方程:f[i+c[k]][(j*10+k)%m]=max{f[i][j]+k}时间复杂度是O(10*nm),看上去好像非常优秀 但是这样的状态值是高精度(能拼成的数可能很大),因此实际计算量非常大 (再说有人愿意随手写一个高精度吗...原创 2018-11-16 13:53:45 · 175 阅读 · 0 评论 -
UVA 1627 Team them up!(dp+二分图染色)
思路:1.将所有不能在一组的两个人连边,二分图染色,若发现染色不成功,则无解。2.若染色成功,同一连通分量里的黑点与白点无法分为一组,不同连通分量中的点可与其他连通分量中的任一种组合,dp。3.设dp[i][j]表示前i个连通分量,是否有差值为j的组合(j可正可负,代表A大于B或B大于A)。设同一连通分量i中的两种点数差值为diff[i],则若dp[i-1][j]==1,则dp[i][j-d...原创 2018-11-12 16:55:28 · 172 阅读 · 0 评论 -
UVA1336 Fixing the Great Wall 区间DP
参考博客:https://www.luogu.org/problemnew/solution/UVA1336思路:我们先贪心的思考,选取的每些数必定是一段连续的区间,于是问题就转化成了区间DP。按照坐标排一下序,(有一点离散化的思想吧,毕竟坐标太大)。每一个位置有两种决策方案,向左走or向右走(这里的走是指走到点,不是一个一个坐标的移动)。我们不妨设f[i][j][k]表示在i到j...原创 2018-11-13 15:05:00 · 194 阅读 · 1 评论 -
UVA 1220 Party at Hali-Bula 最大独立集
题意:n个人形成一个树形结构,除了老板外每个员工都有唯一的直属上司,要求选择尽量多的人,但不能同时选择一个人和他的直属上司,问最多能选多少人,以及人数最多的前提下方案是否唯一。分析:d(u,0)表示以u为根的子树中,不选u点(1表示选择u点)能得到的最大人数f(u,0)=1表示唯一,f(u,0)=0表示不唯一/*d(u,0)表示以u为根的子树中,不选u点(1表示选择u点)能得...原创 2018-11-04 19:25:02 · 127 阅读 · 0 评论 -
UVA 12186 Another Crisis 树形DP
题意:给定一个树形关系图,父节点是子节点得上级,根节点是BOSS,要想给BOSS提意见,直接下级提意见数不小于T%,问最少要多少工人(叶节点)题问分析:dp(u)表示让u给上级发信最少需要多少工人设u有k个儿子节点。那么dp(u)=(k*T-1)/100+1/*dp(u)表示让u给上级发信最少需要多少工人设u有k个儿子节点。那么dp(u)=(k*T-1)/100+1*...原创 2018-11-04 14:17:30 · 129 阅读 · 0 评论 -
UVA 1331 三角剖分
题意:按照顺时针或者逆时针的顺序给出多边的点,要将这个多边形分解成n-2个三角形,要求使得这些三角行中面积最大的三角形面积尽量小,求最小值。分析:https://www.cnblogs.com/Konjakmoyu/p/4905563.html对于对角线不在多边形内的点,其实不用考虑,只用判断三角形内是否有其他点即可。#include<bits/stdc++.h>...原创 2018-11-04 10:40:30 · 166 阅读 · 0 评论 -
UVA 1625 dp
题意:给出两个字符串,计算所拼成的字符串所有字母第一次出现跟最后一次出现的距离和最小是多少。分析:动态规划,dp[i][j]表示第一个字符串前i个跟第二个字符串前j个所拼成的最小和。计算每个字母的贡献,因为不关心每一个颜色,所以只关心有多少种颜色已经开始但是尚未结束。#include<bits/stdc++.h>using namespace std;#d...原创 2018-11-03 22:06:32 · 116 阅读 · 0 评论 -
UVA 12563 DP
分析:经典的背包问题:不过用两个数组,一个标记一共还能听多少歌曲,一个标记听歌的总时间。不过如果采用滚动数组的话一个dp数组就足够用了。#include<bits/stdc++.h>using namespace std;const int maxn=1e4;int dp[55][maxn];int ans[55][maxn];int main(){...原创 2018-11-03 11:24:03 · 101 阅读 · 0 评论 -
POJ 1014 Dividing (多重背包or母函数)
母函数求解:需要注意一点,有个结论,但我还查不到这个结论哪里来的。。。如果n>=8,可将n改写为12(n为偶数),或者11(为奇数)。#include<cstdio>#include<cstring>using namespace std;int a[7];const int maxn=3e7;int x[maxn];int y[ma...原创 2018-09-10 07:51:08 · 338 阅读 · 0 评论 -
ZOJ - 3747 Attack on Titans ( dp递推+思维 )
题意:给n个士兵排队,每个士兵三种G、R、P可选,求至少有m个连续G士兵,最多有k个连续R士兵的排列的种数。分析:至多的情况比较好考虑,至少的情况比较复杂。所以先把问题都转化成至多连续的情况:设 表示至多 x 个连续的 y即答案变为:表示第i个为G,至多有u个连续G,至多有v个连续R的个数 //这里的u和v固定表示第i个为R,至多有u个连续G,至多有v个连续...原创 2019-04-11 09:37:09 · 285 阅读 · 0 评论 -
HDU - 1074 Doing Homework 状压DP
题意:给定n<=15个任务,每个任务给定名称(按照字典序排列),给定这个任务的截止时间跟花费的时间,如果过了截止时间还未完成,则过一分钟惩罚1,问惩罚的最小值。分析:因为n比较小,并且是让你安排一个排列,所以这就是经典的状压DP。用S表示状态,二进制1代表做了这个任务,0表示没有做。从而可以得出状态转移方程(如果当前状态 i 中包含了 j 这个子任务)因为如果当前状态...原创 2019-04-01 20:42:26 · 127 阅读 · 0 评论 -
HDU - 3535 AreYouBusy ( 分组背包 好题 )
题意:给出几组背包,每组背包都有一种对应的类型,(取至少一个,取最多有个,任意取),每个物品只能取一次,计算满足条件的最大价值。分析:只要是提醒自己记住三种背包的写法,其实也挺好理解的,注意的是至少取一个两个判断条件不能互换,因为可能存在0的情况,所以互换可能导致一个物品取了两次。最多取一次不能写成因为可能之前那个物品已经算出来了dp[x][v]的最大值,而在下一次算的时候没有...原创 2019-04-17 12:13:00 · 267 阅读 · 0 评论 -
POJ - 3691 DNA repair (AC自动机+DP)
题意:(换了一种描述,其实是一样的题)分析:首先对与这种题的题问,可以很明显地感觉到DP因为很多模式串,所以考虑多模式匹配的AC自动机算法。首先考虑建立fail树,跟正常的ac自动机的fail树其实是一样的,只不过多了一个东西,就是对于这种情况:以下面这两个字符串建立fail树为例:CDABCDAB那么很显然第二个字符串中间的CD也是非法状态。所以对于建...原创 2019-09-27 22:47:18 · 487 阅读 · 0 评论 -
HDU - 4126 Genghis Khan the Conqueror MST+树形DP
题意:一个N个点的无向图,先生成一棵最小生成树,然后给你Q次询问,每次询问都是x,y,z的形式, 表示的意思是在原图中将x,y之间的边增大(一定是变大的)到z时,此时最小生成数的值是多少。最后求Q次询问最小生成树的平均值。 N<=3000 , Q<=10000分析:先用kruskal算法找到最小生成树,并求出总花费sum.再以枚举n个点,依次作为树根dfs,dp[i][j]...原创 2019-07-07 14:18:00 · 211 阅读 · 0 评论 -
CodeForces 1183H Subsequences (hard version) DP
题意:给出一个字符串删除一些字符使得子串个数是K,并且代价最小,代价为删除的字符数量。分析:表示前i个字符,删除j个后一共有多少种情况如果不考虑重复很容易得出 即当前字符删不删两种情况如果有重复的话,比如abcdgefg ,下标从1开始,那么i=8与k=5相同,如果当前删除的字符是j=3个的话,那么删除 gef 和删除 efg所得的结果相同。多算了abcdg一次,...原创 2019-06-29 16:36:05 · 472 阅读 · 0 评论 -
POJ - 2411 Mondriaan's Dream 状压DP
题意:n*m的矩形用2*1的矩形铺满一共可以有多少种方法?分析:思路来自评论区大神的思路:用2进制的01表示不放还是放第i行只和i-1行有关枚举i-1行的每个状态,推出由此状态能达到的i行状态如果i-1行的出发状态某处未放,必然要在i行放一个竖的方块,所以我对上一行状态按位取反之后的状态就是放置了竖方块的状态。然后用搜索扫一道在i行放横着的方块的所有可能,并且把这些状态累...原创 2019-06-29 14:16:25 · 120 阅读 · 0 评论 -
HDU - 4539 郑厂长系列故事——排兵布阵 ( 状压DP )
题意:每个士兵可以攻击到并且只能攻击到与之曼哈顿距离为2的位置以及士兵本身所在的位置。当然,一个士兵不能站在另外一个士兵所能攻击到的位置,同时因为地形的原因平原上也不是每一个位置都可以安排士兵。现在,已知n,m 以及平原阵地的具体地形,请你帮助郑厂长计算该阵地,最多能安排多少个士兵。分析:因为涉及两行,往常一行的话就直接开个二维的就可以,但现在是两行,所以多加一维即可。其他的还跟...原创 2019-06-29 10:42:46 · 204 阅读 · 0 评论 -
CodeForces - 337D Book of Evil ( 树形DP || 树的直径 )
题意:有一颗有n个结点的树,树上存在一个污染源(位置不确定),它可以污染与它距离不超过d的节点,现给出m个被污染的节点(污染源本身也可能是被污染的节点),求污染源可能的位置数。分析:解法一:树的最长链问题,还是老套路,不过最长链求得是最远的节点,这个题换成了最远的被污染源,状态方程一样,表示以第i 个节点为根节点的子树距离 i 的最远污染源表示以第i 个节点为根节点...原创 2019-07-09 10:40:45 · 373 阅读 · 0 评论 -
HDU - 4507 吉哥系列故事——恨7不成妻 数位DP
题意: 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关—— 1、整数中某一位是7; 2、整数的每一位加起来的和是7的整数倍; 3、这个整数是7的整数倍; 现在问题来了:吉哥想知道在一定区间内和7无关的数字的平方和。分析: dp[len][sum1][sum2] 表示长度为len对7取模为sum1,各位上的数字和为sum2有多...原创 2019-06-27 23:36:23 · 192 阅读 · 0 评论 -
HDU - 6148 Valley Numer 数位DP
题意:当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。比如,1,10,12,212,32122都是 Valley Number。121,12331,21212则不是。度度熊想知道不大于N的Valley Number数有多少。注意,前导...原创 2019-06-26 18:48:41 · 193 阅读 · 0 评论 -
HDU - 3652 B-number 数位DP
题意:计算1-n中能被13整除且包含13的数字的个数。分析:跟不要62差不多一个思路,不过多开一维表示余数;这段时间一直在准备考试感觉水平倒退到了极点,这都调了一个多小时bug,QWQ,加油赶快恢复状态。#include<bits/stdc++.h>using namespace std;int dp[15][15][3];//dp[i][j][k] ...原创 2019-06-26 16:30:08 · 116 阅读 · 0 评论 -
HDU - 2476 String painter (区间DP)
题意:给你两个长度相同的字符串A, B, 要求把字符串A变为字符串B,每次只能选中一个区间[l, r], 将区间内的所有字符全部变为一种字符;问最少需要操作几次能把A转化成B;分析:直接转化不好转化,那么我们可以看作将空字符串转化为B,再计算将A转化为B;那么对于区间[i][j]我们可以得出最坏的情况下,但如果我们考虑这段区间中间k和j相等,那么那么A如何转换成B?令a...原创 2019-05-13 00:53:06 · 247 阅读 · 0 评论 -
POJ - 1239 Increasing Sequences (DP)
题意:给定数字组成的字符串,将其划分为严格递增的序列。且第一个数最大,最后一个数最小。分析:因为要满足两个条件,所以进行两次dp,第一次dp[i]计算到i为止的最小长度,且满足单调递增,那么此时最后一个数就保证了最小,第二次从后往前计算此时dp[i]表示从i开始的最大长度,且满足单调递增,那么此时的第一个数就最大。#include<cstdio>#include&l...原创 2019-05-08 15:44:08 · 484 阅读 · 0 评论 -
HDU - 3810 Magina (并查集+优先队列优化背包)
题意:有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆。最后问在满足打的金钱多余m的情况下的最少时间。分析:如果题目数据范围小点,那么就是一个01背包的板题了,只要在连通块上进行背包就可以了,但是题意M最大是1e9,显然得考虑优化策略,因为自己的知识有限,所以参考的大佬的优化方法,很机智,用优先...原创 2019-05-05 20:52:33 · 430 阅读 · 0 评论 -
HDU - 3092 Least common multiple (数论+背包)
题意:求把一个整数S拆成若干数a_i的和, 并且这些数(a_i)的最小公倍数最大。输出最小公倍数对M取模。分析:容易想到质数肯定是跟答案有关,那么肯定是01背包容量为S,使得总价值最大,总价值即为lcm,但是可能一个素数取多次,例如9,4*5是最优解,但是只可能取素数的幂次,因为这样才能保证集合的数都互质,取倍数不能保证这一点,那么在01背包的基础上进行操作就可以了,枚举每个质数的时候...原创 2019-04-30 09:30:10 · 302 阅读 · 4 评论 -
ZOJ - 3769 Diablo III 分组背包
题意:有13种装备,每种装备只能选一个,每种装备有一个伤害值和防御值,其中如果选Two-Handed的话就不能选Shield和Weapon,Finger可以选两个。求怎样选择,使得在防御值达最小到m的情况下,伤害总值最大。分析:将限制条件进行合并那么这就是一道分组背包的问题,同时因为防御最小为m,所以将防御大于m的时候看成等于m进行计算就方便了很多,那么在递推的时候也要注意,类似...原创 2019-04-28 22:47:11 · 188 阅读 · 0 评论 -
石子合并问题
参考了以下三篇博客:https://blog.csdn.net/more_ugly_less_bug/article/details/60142954https://www.cnblogs.com/slimjerk/p/3835131.htmlhttps://www.cnblogs.com/Renyi-Fan/p/7392649.html直线型合并/*直线型的合并状态:...原创 2018-09-15 22:01:57 · 229 阅读 · 0 评论 -
计蒜客 新年礼物 (trie+exkmp+dp)
刚开始拿上这道题,没有一点思路,看了提示,说kmp处理前后缀,才恍然大悟,加上dp处理结果,妙哉。 #include<bits/stdc++.h>using namespace std;const int MAX_N = 2e6+10; // Trie 树上的最大结点数const int MAX_C = 26; // 每个结点的子结点个数上限...原创 2018-08-24 17:53:45 · 188 阅读 · 0 评论 -
计蒜客 蒜头君的建设方案 (树形dp)
#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fconst int maxn=1e6+10;typedef long long ll;ll f[maxn];ll dp[maxn];ll size[maxn];int cnt;int head[maxn*2];...原创 2018-08-21 16:17:59 · 433 阅读 · 0 评论 -
状压DP(入门)
#include<bits/stdc++.h>using namespace std;const int MAX_N = 20;const int MAX_M = 20;int state[MAX_N + 1];int dp[MAX_N + 1][1 << MAX_M];bool not_intersect(int now, int...原创 2018-08-18 20:54:45 · 2670 阅读 · 2 评论 -
最长上升子序列(LIS)算法
开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp &amp;amp;amp;amp;amp;gt; top 则将temp入栈;如果temp &amp;amp;amp;amp;amp;lt; top则二分查找栈中的比temp大的第1个数,并用temp替换它。 最长序列长度即为栈的大小top。这也是很好理解的,对于x和y,如果x &amp;amp;amp;amp;amp;lt; y且Stack[y] &amp;amp;am原创 2018-05-26 08:17:23 · 302 阅读 · 0 评论 -
多重背包问题
#include <bits/stdc++.h>using namespace std;struct E{ int w; //体积 int v; //重量} lis[2001];int dp[101];int main(){ int T,n,m; int p,h,k; int i,j; int...原创 2018-08-18 10:09:46 · 19729 阅读 · 8 评论 -
完全背包问题
#include <iostream>#include <string.h>using namespace std;int dp[10005];int w[1005],c[1005];int main(){ int n,v; cin>>n>>v; for(int i = 1; i <= n; ...原创 2018-08-18 07:58:54 · 110 阅读 · 0 评论 -
凸边形最优三角剖分(dp)
dp[i][j]表示Ai->Aj的最优权值。 Ai表示vi-1 vi 边 v表示顶点。 经过分析,该问题与矩阵连乘非常相似。 矩阵连乘参考链接 #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace st...原创 2018-04-06 11:43:03 · 723 阅读 · 0 评论