01 2016 档案

摘要:题目问长度m不包含一些不文明单词的字符串有多少个。 依然是水水的AC自动机+DP。。做完后发现居然和POJ2778是一道题,回过头来看都水水的。。。 dp[i][j]表示长度i(在自动机转移i步)且后缀状态为自动机第j个结点的合法字符串数 dp[0][0]=1 转移转移。。。 注意要用高精度,因为答 阅读全文
posted @ 2016-01-31 21:19 WABoss 阅读(317) 评论(0) 推荐(0) 编辑
摘要:题目是给一个DNA重新排列使其包含最多的数论基因。 考虑到内存大概就只能这么表示状态: dp[i][A][C][G][T],表示包含各碱基个数为ACGT且当前后缀状态为自动机第i的结点的字符串最多的数论基因数 其中ACGT可以hash成一个整数(a*C*G*T+c*G*T+g*T+T),这样用二维数 阅读全文
posted @ 2016-01-31 18:59 WABoss 阅读(256) 评论(0) 推荐(0) 编辑
摘要:题目是给几个带有价值的单词。而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题。。不一样的是这题要输出具体方案,加个字符数组记录每个状态最优情况的字符串即可。 另外题目字典序是先考虑长度再考虑每一位单词;特别要注意, 阅读全文
posted @ 2016-01-30 23:13 WABoss 阅读(212) 评论(0) 推荐(0) 编辑
摘要:题目大概是给几个DNA片段以及它们各自的权值,如果一个DNA包含某个片段那么它的价值就加上这个片段的权值,同时包含多个相同DNA片段也只加一次,问长度l的DNA可能的最大价值。 与HDU2825大同小异。 dp[i][j][S]表示长度i(自动机转移i步)、后缀状态为自动机第j个结点、包含的DNA片 阅读全文
posted @ 2016-01-30 19:22 WABoss 阅读(215) 评论(0) 推荐(0) 编辑
摘要:题目给一棵有边权的树,问树上任意两点路径上的边异或值最多是多少。 记录每个点u到根路径的异或值xor[u],那么任意两点u、v路径的异或值就是xor[u]^xor[v]。 于是这个问题就变成了从n个数中任取两个数异或,求最大异或值,这是个经典的问题,用字典树解决。 方法就是所有数的二进制形式构建成一 阅读全文
posted @ 2016-01-30 16:38 WABoss 阅读(199) 评论(0) 推荐(0) 编辑
摘要:题目问长度n至少包含k个咒语的字符串有多少个。也是比较入门的题。。 dp[i][j][S]表示长度i(在自动机上转移k步)且后缀状态为自动机上第j个结点且当前包含咒语集合为S的方案数 dp[0][0][0]=1 还是用我为人人转移,AC自动机上的结点要多一个域表示这个结点所代表咒语前缀包含的咒语集合 阅读全文
posted @ 2016-01-30 11:15 WABoss 阅读(748) 评论(0) 推荐(0) 编辑
摘要:题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段。 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来。 dp[i][j]表示原DNA前i位(在AC自动机上转移i步)且后缀状态为AC自动机结点j的最少需要修改的基因数 转移我为人人型,从dp[i][j]向ATCG四个 阅读全文
posted @ 2016-01-29 20:06 WABoss 阅读(321) 评论(0) 推荐(1) 编辑
摘要:与POJ2778一样。这题是求长度不超过n且包含至少一个词根的单词总数。 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn。 答案就是,Sn-Tn。 Sn=26+262+263+...+26n Tn=A+A2+A3+...+An (A为AC自动机构造出来的矩阵) 可以构造矩阵 阅读全文
posted @ 2016-01-29 16:24 WABoss 阅读(658) 评论(1) 推荐(1) 编辑
摘要:题目给m个病毒串,问不包含病毒串的长度n的DNA片段有几个。 感觉这题好神,看了好久的题解。 所有病毒串构造一个AC自动机,这个AC自动机可以看作一张有向图,图上的每个顶点就是Trie树上的结点,每个结点都可以看作是某个病毒串的前缀,Trie树的根则是空字符串。 而从根出发,在AC自动机上跑,经过k 阅读全文
posted @ 2016-01-28 17:57 WABoss 阅读(3601) 评论(0) 推荐(7) 编辑
摘要:题目大概是依次有n场派对,每场派对都有需要穿某套衣服去参加,可以同时穿多套衣服,就是一套套着一套,如果脱了的话就不能再穿上那套了,问最少需要几套衣服去参加完所有派对。 区间DP: dp[i][j]第i场到第j场派对需要最少的衣服 dp[i][i]=1 dp[i][j]=min(dp[i][j-1]+ 阅读全文
posted @ 2016-01-27 22:16 WABoss 阅读(182) 评论(0) 推荐(0) 编辑
摘要:AC自动机是一种多模式匹配的算法。大概过程如下:   而这题大概就是给几个模式串,一个主串,问有几个模式串被主串匹配。 AC自动机的模板题。有个可以优化的地方就是某个模式串被匹配了,下一次经过这儿就可以跳过了temp指针的过程了。   代码参考自kuangbin巨的博客,太简洁了(300+ms): 阅读全文
posted @ 2016-01-27 20:26 WABoss 阅读(281) 评论(0) 推荐(0) 编辑
摘要:题目给定一个字符串集合有几种方式拼成一个字符串。 dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符串构造一棵Trie树,然后就可以在线性时间判断哪几个前缀字符串在集合里。 1 #include<cs 阅读全文
posted @ 2016-01-27 15:45 WABoss 阅读(498) 评论(0) 推荐(0) 编辑
摘要:我的做法是先建字典树,统计每个结点出现次数和相同字符串个数,每个结点对答案的贡献就是2*C(次数,2),然后再分别讨论相同字符串和不同字符串对答案的贡献。 另外这题主要就是Trie树的孩子兄弟表示法: 因为数据范围,4000个字符串每个字符串长度1000且字符的范围有62个,用孩子链表表示法最坏,4 阅读全文
posted @ 2016-01-27 12:23 WABoss 阅读(431) 评论(0) 推荐(0) 编辑
摘要:题目大概是,二进制数可以看作是由几段连续的0和连续的1组成,问:n位没有前导0的 且 共用k段连续0/1组成的 且 连续0/1个数不超过m的二进制数有多少个。 用dp[n][k][m]表示问题 dp[i][1][j]=1 (i<=j) 通过枚举第一段连续数字的个数first,使dp[n][k][m] 阅读全文
posted @ 2016-01-26 21:22 WABoss 阅读(189) 评论(0) 推荐(0) 编辑
摘要:常规做法是枚举每个字符串每个位置,时间复杂度O(n*len*len),(建字典树O(n*len))。 然而我看这题第一眼想的是时间复杂度O(n*len)的算法。。就是建正反两棵字典树,每个字符串跑分别跑正反一遍字典树,再看看正反跑的结果能不能拼成原串。 然而常数太大了点,并没什么卵用。。 1 #in 阅读全文
posted @ 2016-01-26 20:40 WABoss 阅读(202) 评论(0) 推荐(0) 编辑
摘要:题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多。 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以看到信息。 然后SCC缩点后就形成DAG,直接记忆化搜索,d(u)搜索从u点出发开始传最多能传多少人 阅读全文
posted @ 2016-01-25 22:13 WABoss 阅读(203) 评论(0) 推荐(0) 编辑
摘要:题目大概就是求一个n个不同的数能构造出几种形态的二叉排序树。 和另一道经典题目n个结点二叉树不同形态的数量一个递推解法,其实这两个问题的解都是是卡特兰数。 dp[n]表示用n个数的方案数 转移就枚举第几个数作为根,然后分成左右两子树,左右两子树的方案数的乘积就是这个数作根的方案数 另外就是题目得先找 阅读全文
posted @ 2016-01-25 20:42 WABoss 阅读(247) 评论(0) 推荐(0) 编辑
摘要:题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v)。 把图的强连通分量缩点,那么答案显然就是所有出度为0的点。 用Tarjan找强连通分量: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using n 阅读全文
posted @ 2016-01-25 10:57 WABoss 阅读(305) 评论(0) 推荐(0) 编辑
摘要:这题事实上只需要关心15个商店和一个起点一个终点,预处理出这几个点之间的最短距离。Floyd会超时,用Dijkstra即可。 然后就是dp[u][S]表示已经经过商店集合S且当前在第u个商店所花的最少时间。 最后的结果是找到所有dp[u][S]有解且u能到达终点的最大的|S|,而最短时间就是dp[u 阅读全文
posted @ 2016-01-25 09:34 WABoss 阅读(172) 评论(0) 推荐(0) 编辑
摘要:题目问一个有向图所有点都能达到的点有几个。 先把图的强连通分量缩点,形成一个DAG,那么DAG“尾巴”(出度0的点)所表示的强连通分量就是解,因为前面的部分都能到达尾巴,但如果有多个尾巴那解就是0了,因为尾巴间达到不了。判断是否有多个尾巴,可以从最后一个强连通分量中的某一个点出发看能否在逆图上遍历完 阅读全文
posted @ 2016-01-24 20:00 WABoss 阅读(134) 评论(0) 推荐(0) 编辑
摘要:这道题要判断一张有向图是否是单连通图,即图中是否任意两点u和v都存在u到v或v到u的路径。 方法是,找出图中所有强连通分量,强连通分量上的点肯定也是满足单连通性的,然后对强连通分量进行缩点,缩点后就变成DAG。 现在问题就变成,如何判断DAG是否是单连通图——用拓扑排序——如果拓扑排序过程中出现1个 阅读全文
posted @ 2016-01-24 18:25 WABoss 阅读(592) 评论(0) 推荐(0) 编辑
摘要:一道经典的树型DP入门题。dp[u][0/1]表示u点不选或选时以u为根的子树最多能选择的点数。 题目给的有向有环图可以看作森林,注意不是树,因为题目没有说图是连通的! 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 us 阅读全文
posted @ 2016-01-23 22:11 WABoss 阅读(139) 评论(0) 推荐(0) 编辑
摘要:题目大概是给一张图,动态加边动态求割边数。 本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和。。好像好难写。。 看了别人的解法,这题有更简单的算法: 在任意两点添边,那么两点路径上的边就不是割边了,于是从两点往上走到其LCA,一边缩点一边统计消失的割边数。 这样的时间 阅读全文
posted @ 2016-01-23 21:08 WABoss 阅读(248) 评论(0) 推荐(0) 编辑
摘要:题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径。 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是割边,与不存在割边矛盾。 这题的解法是:原图的边双连通分量是符合要求的可以看作一点,即把原图的边双连 阅读全文
posted @ 2016-01-23 20:44 WABoss 阅读(354) 评论(2) 推荐(0) 编辑
摘要:题目要输出一个无向图的所有割边。用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边)。 顺便求出每个结点的DFS序dfn[u] 和 每个结点能沿着它和它的儿子的返祖边达到的结点最小的DFS序low[u]。 一条边(u,v 阅读全文
posted @ 2016-01-23 20:26 WABoss 阅读(257) 评论(0) 推荐(0) 编辑
摘要:题目求一个无向图的所有割点,并输出删除这些割点后形成几个连通分量。用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边)。 顺便求出每个结点的DFS序dfn[u] 和 每个结点能沿着它和它的儿子的返祖边达到的结点最小的DF 阅读全文
posted @ 2016-01-23 20:16 WABoss 阅读(228) 评论(0) 推荐(0) 编辑
摘要:题目大概是说给一棵树的n个结点从1到n编号,要求每个结点的编号大于其父结点,问有多少种编号方式。 想了挺久的,感觉有点眉目,最后画了下样例YY出解法: 首先求出以每个结点为根的子树大小,记为size[u],这个DFS一遍就可以求出来; 接下来,dp[u]表示给以u为根的子树size[u]个编号有几种 阅读全文
posted @ 2016-01-22 19:14 WABoss 阅读(258) 评论(0) 推荐(0) 编辑
摘要:题目问N匹马比赛有多少种结果。一开始想用排列组合搞搞,然后发现想错了。艰难地把思路转向DP,最后AC了。 dp[i][j]表示前i匹马确定出j个名次的方案数 dp[1][1]=1 对于第i匹马,它要确定出j个名次:要嘛前i-1匹确定出j个次名,然后第i匹可以成为第1...j名;要嘛前i-1匹确定出j 阅读全文
posted @ 2016-01-21 22:17 WABoss 阅读(206) 评论(0) 推荐(0) 编辑
摘要:题目问从N个数中取出M个数,有多少种取法使它们的和能被D整除。 dp[i][j][k]表示,前i个数取出j个数模D的余数为k的方案数 我用“我为人人”的方式来转移,就从i到i+1转移,对于第i+1个数有取和不取两种选择,然后确定j和k这两个维度的情况。 另外题目说数字是32位有符号整数,所以是会出现 阅读全文
posted @ 2016-01-20 18:09 WABoss 阅读(162) 评论(0) 推荐(0) 编辑
摘要:dp[S]表示已经完成的工作集合 枚举从哪儿转移过来的,再通过枚举计算花费。。水水的。。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define INF (1<<30) 阅读全文
posted @ 2016-01-20 16:31 WABoss 阅读(260) 评论(0) 推荐(0) 编辑
摘要:题目要求第k个没有连续两个1的二进制数。 这算数位DP吧,只不过以前遇到的是统计区间的数字情况,而这题是求第几个数字,差不多是反过来的。 本来我想用状态dp[i][0/1]表示长度i末尾0或1的二进制数个数,发现这样好像没法解。 最后需要根据数位DP状态的值推算出要求二进制数各个位置是0还是1,这个 阅读全文
posted @ 2016-01-19 12:01 WABoss 阅读(224) 评论(0) 推荐(0) 编辑
摘要:题目求从某点出发回到该点经过所有边至少一次的最短行程。 这个问题我在《图论算法理论、实现及应用》中看过,是一个经典的问题——中国邮递员问题(CPP, chinese postman problem)也称为中国邮路问题,是我国数学家管梅谷教授于1962年首次提出的,引起了世界不少数学家的关注。例如19 阅读全文
posted @ 2016-01-18 21:19 WABoss 阅读(1856) 评论(0) 推荐(0) 编辑
摘要:这题要求区间有多少个模K且各位数之和模K都等于0的数字。 注意到[1,231]这些数最大的各位数之和不会超过90左右,而如果K大于90那么模K的结果肯定不是0,因此K大于90就没有解。 考虑到数据规模,数据组数,这题状态这么表示: dp[i][j][k]:位数为i模K结果为j且各位数之和模K结果为k 阅读全文
posted @ 2016-01-17 21:50 WABoss 阅读(174) 评论(0) 推荐(0) 编辑
摘要:一年多前遇到差不多的题目http://acm.fafu.edu.cn/problem.php?id=1427。 一开始我还用搜索。。后来那时意外找到一个不重复全排列的计算公式:M!/(N1!*N2!*...*Nn!), 然后就靠自己YY出解法,搞了好几天,最后向学长要了数据,然后迷迷糊糊调了,终于A 阅读全文
posted @ 2016-01-16 17:42 WABoss 阅读(303) 评论(0) 推荐(0) 编辑
摘要:第一眼以为是概率DP,我还不会。不过看题目那么短就读读,其实这应该还不是概率DP,只是个水水的DP。。 dp[n][s]表示掷n次骰子点数和为s的情况数 dp[0][0]=1 dp[i][j]=∑dp[i-1][j-k] (k∈[1,6] 且 j-k>=0) 要求的概率就是情况数/掷n次骰子的总情况 阅读全文
posted @ 2016-01-16 15:41 WABoss 阅读(212) 评论(0) 推荐(0) 编辑
摘要:dp[i][j]表示长度i末尾为S[j]的方案数 dp[1][0...m-1]=1 dp[i][j]=∑dp[i-1][k] (|S[k]-S[j]|<=2) 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 using nam 阅读全文
posted @ 2016-01-15 23:36 WABoss 阅读(363) 评论(0) 推荐(0) 编辑
摘要:一个经典的构图:对格子进行黑白染色,黑白的点分别作XY部的点。 这一题的边就是可以出售的单位面积2的土地,边的端点就是这个土地占用的X部和Y部的两个点。 这样就建好二分图,要求最多土地的答案显然是这个二分图的最大边独立集,也就是最大匹配。 1 #include<cstdio> 2 #include< 阅读全文
posted @ 2016-01-15 20:24 WABoss 阅读(373) 评论(0) 推荐(0) 编辑
摘要:这道题可以想到几点: 整个行程可以看作一次次的行走,每次行走都是用最短的路程从某一非空点到达另外一非空点; 两点间最少的步数是二者x和y坐标差的最大值; 返回原点这个过程,肯定是取完最后一个黄金后直接用最少的步数从这儿出发回到原点。 然后就是状压DP了: dp[u][S]:经过非空点集S后到达u点最 阅读全文
posted @ 2016-01-15 17:12 WABoss 阅读(197) 评论(0) 推荐(0) 编辑
摘要:这题感觉做法应该挺多吧,数据规模那么小。 我用DP乱搞了。。 dp0[i][j]表示字符串前i位能否组成末尾有连续j个元音字母 dp1[i][j]表示字符串前i位能否组成末尾有连续j个辅音字母 我的转移方案是尽量不要出现BAD字符串。 如果最后转移不过去那就说明一定会出现BAD字符串,如果可以转移到 阅读全文
posted @ 2016-01-15 16:09 WABoss 阅读(321) 评论(0) 推荐(0) 编辑
摘要:问题问的是最少可以把一个字符串分成几段,使每段都是回文串。 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时候要枚举,这样时间复杂度是不可行的。 然后我就想降维度了,只能线性DP,dp[i]表示子串[0,i] 阅读全文
posted @ 2016-01-14 17:32 WABoss 阅读(201) 评论(0) 推荐(0) 编辑
摘要:dp[S]表示已经消灭目标集合为S的最少射击数 dp[0]=0 dp[S]=min( dp[S'] + min( health[i] , health[i]/demage[j][i] ) ) 其中S-S'={i},j∈S' 1 #include<cstdio> 2 #include<cstring> 阅读全文
posted @ 2016-01-14 15:50 WABoss 阅读(172) 评论(0) 推荐(0) 编辑
摘要:题目要计算一个字符串最少添加几个字符使其成为回文串。 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=1007。 当时完全靠自己瞎YY出了LCS的解法: 我当时这么想的: 把字符串分成两个部分,假设这两个部 阅读全文
posted @ 2016-01-13 19:30 WABoss 阅读(245) 评论(0) 推荐(0) 编辑
摘要:显然数位DP。 dp[i][j]表示所有末尾为j的i位二进制数相邻位的数量和 初始状态dp[2][1]=1 从长度i-1转移到长度i就是在i-1位的末尾添上0或1,转移方程就是: dp[i][0]=dp[i-1][0]+dp[i-1][1] dp[i][1]=dp[i-1][0]+dp[i-1][1 阅读全文
posted @ 2016-01-13 16:24 WABoss 阅读(264) 评论(0) 推荐(0) 编辑
摘要:最大点独立集就是无向图中最多的两两不相邻的点集。 二分图最大点独立集=顶点数-二分图最大边独立集(二分图最大匹配) 这一题男女分别作YX部,如果x和y有浪漫关系则连边,如此构造二分图,答案显然就是最大点独立集。另外要先进行二分图染色,以确定每个id的性别。 1 #include<cstdio> 2 阅读全文
posted @ 2016-01-12 21:07 WABoss 阅读(440) 评论(0) 推荐(0) 编辑
摘要:最小点权覆盖就是,对于有点权的有向图,选出权值和最少的点的集合覆盖所有的边。 解二分图最小点权覆盖集可以用最小割: vs-X-Y-vt这样连边,vs和X部点的连边容量为X部点的权值,Y部和vt连边容量为Y部点的权值,X和Y是原二分图中的边容量为INF。 这一题建二分图是这样的:把原图中的点拆成两个点 阅读全文
posted @ 2016-01-12 19:44 WABoss 阅读(417) 评论(0) 推荐(0) 编辑
摘要:我可能真想不到这题是区间DP,不过知道是区间DP想了下就AC了。 dp[i][j]表示局面为ai...aj先手能获得与后手得分的最大差值 那么转移到当前状态就是枚举中间的位置,分成两边,其中一边先手全部取另一边就是新的局面,后手变成新的先手的局面,而后手也会采取最优策略也会尽量让剩下这个局面差值最大 阅读全文
posted @ 2016-01-12 18:14 WABoss 阅读(252) 评论(0) 推荐(0) 编辑
摘要:最小点覆盖集就是在一个有向图中选出最少的点集,使其覆盖所有的边。 二分图最小点覆盖集=二分图最大匹配(二分图最大边独立集) 这题A机器的n种模式作为X部的点,B机器的m种模式作为Y部的点; 每个任务就作为边,端点是可以完成它的A和B的某个模式。 这样,问题就变成在这个二分图中取出最少的点覆盖所有的边 阅读全文
posted @ 2016-01-12 09:44 WABoss 阅读(164) 评论(0) 推荐(0) 编辑
摘要:最大匹配也叫最大边独立集,就是无向图中能取出两两不相邻的边的最大集合。 二分图最大匹配可以用最大流来解。 如果题目没有墙,那就是一道经典的二分图最大匹配问题: 把地图上的行和列分别作为点的X部和Y部,地图上每一块空地看作边,边的两个端点就是它所在的x行y列。这样,求最大边独立集即可。 而这一题有墙, 阅读全文
posted @ 2016-01-11 21:14 WABoss 阅读(262) 评论(0) 推荐(0) 编辑
摘要:给一个字符串,问有几种删字符的方式使删后的非空字符串是个回文串。 当然区间DP:dp[i][j]表示子串stri...strj的方案数 感觉不好转移,可能重复算了。我手算了"AAA"这个数据,然后就搞出转移的方式: d[i][j] = ∑ d[i'][j']+1 (i<=i'<=j'<=j 且 st 阅读全文
posted @ 2016-01-11 10:36 WABoss 阅读(239) 评论(0) 推荐(0) 编辑
摘要:求一个图的哈密顿路径的最大权及其路径数。显然状态压缩+DP。 dp[v][u][S] 表示从v走到当前顶点 u且走过的顶点集合是S的 最大权值和方案数 这题我用记忆化搜索,从终点开始递归进行,感觉这样比较容易转移。 就是搜索一个状态可以从哪些状态转移过来,顺便统计方案数。搜索时要注意一些细节,转移要 阅读全文
posted @ 2016-01-10 17:10 WABoss 阅读(188) 评论(0) 推荐(0) 编辑
摘要:容易想到状态dp[n][S][m](S是数字出现的集合),表示前n位用了数字集S且模k余数是m的方案数。 利用 (xy)base % k = ( x*base+y ) % k = (( x%k ) * base + y) % k ,进行状态第三维的转移。 不过d[16][216][20]有2000多 阅读全文
posted @ 2016-01-09 19:25 WABoss 阅读(195) 评论(0) 推荐(0) 编辑
摘要:容易猜测到包含s1、s2序列的串的最短长度是LCS(s1,s2) + ( len(s1) - LCS(s1,s2) ) + ( len(s2) - LCS(s1,s2) ) ,即: len(s1)+len(s2)-LCS(s1,s2) 接下来求方案数,可以想到: dp[k][i][j]表示由s1前i 阅读全文
posted @ 2016-01-09 10:37 WABoss 阅读(183) 评论(0) 推荐(0) 编辑
摘要:n位密码,要用尽可能短的序列将n位密码的10n种状态的子串都包括,那么要尽量地重合。 题目已经说最短的是10n + n - 1,即每一个状态的后n-1位都和序列中后一个状态的前n-1位重合。 这题是经典的欧拉路径问题吧,用n位数字10n种状态来作为边,而用重合的n-1位数字表示点。 具体的建图,每个 阅读全文
posted @ 2016-01-08 19:54 WABoss 阅读(343) 评论(0) 推荐(0) 编辑
摘要:与ZOJ2770一个建模方式,前缀和当作点。 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次。 后来偷看数据才想到这题还有两个隐藏的约束条件。 这题前缀和表示的是区间内点存在的个数,因此: Si>=Si-1 Si-Si-1<=1 所以,差分约束系统的构图一定要 阅读全文
posted @ 2016-01-04 10:08 WABoss 阅读(200) 评论(0) 推荐(0) 编辑
摘要:区间和一定要联系到前缀和。 这题,把前缀和看作点,从s0到sn; 对于每一个营地i的容量capi,有这么个关系si-si-1<=capi; 对于每一个区间的评估i,j,k,有sj-si-1>=k,即si-1-sj<=k; 接下来就是连边了,对于v<=u+w由u向v连权w的边,超级源向n+1个点连权0 阅读全文
posted @ 2016-01-03 21:17 WABoss 阅读(340) 评论(0) 推荐(0) 编辑
摘要:d[i][j]表示从i点到j点可以全程提供光纤的公司的集合,集合用26位的二进制压缩。 那么状态转移方程就是dk[i][j]|=dk-1[i][k]&dk-1[k][j]。 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 阅读全文
posted @ 2016-01-03 14:49 WABoss 阅读(191) 评论(0) 推荐(0) 编辑
摘要:题目要求1到n点的最大容量的增广路。 听说是最短路求的,然后乱搞就A了。。 大概能从Bellman-Ford的思想,dk[u]表示从源点出发经过最多k条边到达u点的最短路,上理解正确性。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 阅读全文
posted @ 2016-01-01 23:11 WABoss 阅读(286) 评论(0) 推荐(0) 编辑
摘要:单整点集V是无向无环图,可以看作树。 dp[u]表示,选取u点时u点和它子树最大的权和。 而某个点不选,那么它和它子树的最大权和是0,因为题目求的集合要连通。 状态转移方程是:dp[u]=∑max(0,dp[son(u)])。 1 #include<cstdio> 2 #include<cstdli 阅读全文
posted @ 2016-01-01 21:31 WABoss 阅读(247) 评论(0) 推荐(0) 编辑
摘要:跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环。 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<string> 5 # 阅读全文
posted @ 2016-01-01 15:43 WABoss 阅读(742) 评论(0) 推荐(0) 编辑
摘要:边取反,从汇点跑单源最短路即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 1111111 7 #defin 阅读全文
posted @ 2016-01-01 09:40 WABoss 阅读(237) 评论(0) 推荐(0) 编辑