状态压缩DP
文章平均质量分 79
AC_Arthur
Die luft der Freiheit weht
展开
-
10817 - Headmaster's Headache(校长的烦恼)
经典的状态压缩DP 。 根据DP的阶段定义,我们需要枚举每一个教师进行递推,但是由于每个教师可以教授的课程是复杂多样的,所以使得状态变得难以转移 。那么要怎么样表示状态呢? 显然增加一两个维度是无法胜任的,所以我们可以用二进制枚举子集的方法,用一个整数通过位运算充当一个集合 。 C++提供的位运算符极像对集合的操作,我们恰好可以利用这一点 。 用d[i][s1][s2]表示考虑了前i个人时的最原创 2015-07-15 20:01:40 · 1176 阅读 · 0 评论 -
1252 - Twenty Questions(状态压缩DP)
经典的状态压缩DP 。 有没有感觉这道题和什么东西有点像? 没错,是01背包 。 将特征看作物品 , 只不过这里的状态有点复杂, 需要用一个集合才能表示它, 所以我们用d[s][a]来表示,已经询问了特征集s , 假设我们要猜的物品是w ,w所具备的特征集为a ,此时还要询问的最小次数 。 显然a是s的子集,而且要注意本题的要求, 求的是最小化的最大询问次数 。也就是说无论猜哪个物品,猜这原创 2015-07-17 19:17:38 · 839 阅读 · 0 评论 -
hdu5135 Little Zu Chongzhi's Triangles(DP)
该题其实是个DP,可能数据比较水,队友排序后从大的开始取都过了。。 我们来说说正解,一开始其实我已经写出来了,只是有一个地方导致了一直在输出一个不是数字的值,赛后才发现是我用memset对一个double类型的数组清-1的原因 ,改了一下就对了 。 直接开一维数组,用二进制表示集合的方法来表示哪些木棍被选取了 。 很简单的状态压缩DP 。 我用的记忆化搜索,该题还可以用三重循环地推原创 2015-08-02 21:22:12 · 912 阅读 · 0 评论 -
Codeforces Round #235 (Div. 2) D. Roman and Numbers(状态压缩DP)
题目链接:点击打开链接 题意:给你一个数n,要求将n的各个位上的数重新排列(不能有前导0),使得形成的数对m取模为0, 问有多少个这种数。 思路:因为n太大了,枚举全排列复杂度高达n!。 因为n最大有18位, 所以可以用状态压缩每一位,表示当前的答案中选了哪些数了。 那么不难想到状态d[i][j]表示当前已经把哪些位上的数用了(用集合i表示),且此时余数为j的答案数。 这样递推到所有数都用了原创 2016-01-25 23:21:14 · 1469 阅读 · 0 评论 -
HDU Disney's FastPass(状态压缩DP)
题目链接:点击打开链接 题意:给你一个n个点的完全图, 图中任意两个点都有直接相连的路,在某些点上可以获得某些景观的入场券,有入场券和没有入场券进入景观要等候的时间不同,有k个景观,要求从1点出发参观完所有景观后回到1的最小花费。 思路: 很明显的状态压缩DP, 因为 k 很小,所以可以压缩成一个整数,表示哪些景观已经参观完了。 然后还要表示出当前到了哪个点, 又因为有没有票的等候时间是不同的原创 2016-01-27 15:32:46 · 1265 阅读 · 1 评论 -
UVA 11795 - Mega Man's Mission(状态压缩DP)
题目链接:点击打开链接 思路: 很容易想到用d[i][s]表示杀死了i个机器人了, 杀死的机器人集合是s的方法数。 转移也很容易我就不说了, 我的转移复杂度是n^2的, 当然你也可以预处理一下某个机器人能被哪些机器人集合杀死, 直接用位运算与来判断, 使得转移变成O(n) 细节参见代码: #include #include #include #include #include原创 2016-09-05 17:21:47 · 652 阅读 · 0 评论