摘要: 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 阅读(1841) 评论(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) 编辑