随笔分类 - 状压DP
摘要:基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算。我们可以先把输入中每行的01压缩成一个整数。判断一个状态是否有相邻1:如果 x & (x 2 #include 3 4 const int maxn = 13; 5 const int M = 100000000;...
阅读全文
摘要:题意:有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数。每次只可以询问该数的第K为是否为1.问采用最优询问策略,则最少需要询问多少次能保证猜到。比如有1100 和 0110两个数,只需要询问第一或第三位数是否为1,即可猜中,因此答案为1.分析:d...
阅读全文
摘要:题意:一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师。每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门。要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两个老师教而且使得总工资最少。分析:因为s很小,所以可以用状态压缩。dp(i, s1, s2)表示考虑了前i...
阅读全文
摘要:第一次做这道题大概是半个月前了吧,状压DP一个很新鲜的名词当时看题解怎么也看不懂,现在看懂了以后还是很简单的所谓状态压缩就是用一个整数的二进制来表示一个状态,比如有三个作业000表示一科作业也没做,001表示只做了第一科,111表示三科作业都做了那么从状态0开始出发,遍历每一个状态,如果对于状态S有...
阅读全文
摘要:大白书中的题感觉一般都比较难,能理解书上代码就已经很不错了按照经验,一般数据较小的题目,都有可能是用状态压缩来解决的题意:问一个面积为x×y的巧克力,能否切若干刀,将其切成n块面积为A1,A2,,,An块巧克力。(每次只能沿直线切一块巧克力)设计状态:f(r, c, S) = 1表示r行c列的巧克力...
阅读全文
摘要:这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的。题意:有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服务器相连。对于每台服务器,你可以选择停止该台以及与这台服务器相连的服务器的一项服务。如果一台服务器的所有...
阅读全文