状压DP
BrooksBUAA
这个作者很懒,什么都没留下…
展开
-
[HDU 4739]Zhuge Liang's Mines:状压DP
点击这里查看原题题目中只有20个点,因此可以枚举每种选点方案,然后进行状态压缩DP。f[i]=max(f[i],f[i^t]+4) (我因为判断函数写错,WA了好几次)/*User:SmallLanguage:C++Problem No.:4739*/#include<bits/stdc++.h>#define ll long long#define inf 999999999us原创 2017-04-12 20:00:29 · 392 阅读 · 0 评论 -
[XDU 1203]Happy to Eliminate:状压DP
点击这里查看原题当时校赛的时候没做出来,现在才知道状压DP可以按格点转移。 按格点转移的状压DP可以先参考POJ 2411,这个题不同的地方是按2k进制压位,因为矩形的短边不会超过6,所以最大状态数为8^6,即2^18。对于每一位,如果值小于k,表示在这一列连续出现了1次,如果大于等于k,则表示在这一列连续出现了两次,放置的时候既要考虑横行也要考虑纵行。/*User:SmallLanguage原创 2017-05-02 20:38:09 · 460 阅读 · 0 评论 -
[HDU 2167]Pebbles:状压DP
点击这里查看原题比HDU1565更复杂的一道状压DP,需要多记录一位左上角的情况。每次换行的时候不需要考虑左上角,但是需要将每一位左移一位图转自http://blog.csdn.net/sf____/article/details/15026397 /*User:SmallLanguage:C++Problem No.:2167*/#include<bits/stdc++.h>#def原创 2017-05-02 14:58:27 · 414 阅读 · 0 评论 -
[HDU 1565]方格取数(1):状压DP
点击这里查看原题格点转移/*User:SmallLanguage:C++Problem No.:1565*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;int n,p,q,a[20][20];ll f[2][1<<20],ans;void solve(){原创 2017-05-02 11:13:48 · 549 阅读 · 0 评论 -
[POJ 2411]Mondriaan's Dream:状压DP
点击这里查看原题以往的做法是按行进行转移,需要预处理出各种状态间的转移。一种更快的做法是按格点进行转移,状态表示的是每个已被处理过的格点的下一行的状态。具体可以参考http://blog.csdn.net/sf____/article/details/15026397 /*User:SmallLanguage:C++Problem No.:2411*///#include<bits/st原创 2017-05-02 10:51:49 · 488 阅读 · 0 评论 -
[CF 417D]Cunning Gena:状压DP
点击这里查看原题先把每个人按k升序排序, f [ i ] 表示完成状态i的最小花费,计算出显示器数量分别为 k [ j ] 时 f [ ( 1 < < m ) - 1 ] 的最小值,ans = min { f [ ( 1 < < m ) - 1 ] + k [ j ] * b }。/*User:SmallLanguage:C++Problem No.:417D */#include<bit原创 2017-04-19 10:22:22 · 412 阅读 · 0 评论 -
[BZOJ 1231][Usaco2008 Nov]mixup2 混乱的奶牛:状压DP
点击这里查看原题f[i][j]表示状态为i,以奶牛j结尾的情况数/*User:SmallLanguage:C++Problem No.:1231*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;const int M=(1<<16)+5;int a[20],n原创 2017-04-19 09:06:44 · 346 阅读 · 0 评论 -
[BZOJ 4197][Noi2015]寿司晚宴:状压DP
点击这里查看原题因为小于sqrt(500)的素数只有8个,而一个数大于sqrt(500)的素因子最多只有一个,因此可以将所有数分类,用一个二进制的8位数表示出现了哪些素因子,kind表示这个数的大于sqrt(500)的素因子,若不存在,则kind=1。将所有数按kind排序。 进行状压DP,f[i][j]表示1采用i方案,2采用j方案的方法数;p[i][j][k]表示该第i个人操作,1采用i方案,原创 2017-04-13 16:14:59 · 282 阅读 · 0 评论 -
[BZOJ 1725][Usaco2006 Nov]Corn Fields牧场的安排:状压DP
点击这里查看原题用二进制串表示每一行的摆放情况,预处理出各个状态间的转移关系即可。 f[i][j]表示第i行按状态j摆放的方案数。/*User:SmallLanguage:C++Problem No.:1725*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;原创 2017-04-17 21:18:07 · 357 阅读 · 0 评论 -
[BZOJ 2064]分裂:状压DP
点击这里查看原题状压DP,sum[i]表示状态i时的面积和,f[i]表示状态i时可以少操作的次数。 因为可以把所有块合成一大块然后分裂,所以操作最多不超过n+m-2次,而如果有某个子集中的块面积和为0,则可以少操作2次,因此最终答案为n+m-f[1<<(n+m)-1]。/*User:SmallLanguage:C++Problem No.:2064*/#include<bits/stdc原创 2017-04-17 20:44:40 · 318 阅读 · 0 评论 -
[BZOJ 1076][SCOI2008]奖励关:状压DP
点击这里查看原题f[i][j]表示到第i次,吃完后状态为j的期望,则f[i][j]=上一步的期望+这一步的得分/n。 为了方便整理答案,使用倒推,答案即为f[1][0]。/*User:SmallLanguage:C++Problem No.:1076*/#include<bits/stdc++.h>#define ll long long#define inf 999999999u原创 2017-04-17 19:59:47 · 404 阅读 · 0 评论 -
[BZOJ 1087][SCOI2005]互不侵犯King:状态压缩DP
点击这里查看原题f[i][j][k]表示到第i行,摆放了j个国王且第i行摆法为k的方法数。 先预处理出所有摆法和摆法之间的转移关系,然后DP/*User:SmallLanguage:C++Problem No.:1087*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace原创 2017-04-17 17:54:27 · 315 阅读 · 0 评论 -
[HDU 5731]Solid Dominoes Tilings:状压DP+容斥原理
点击这里查看原题这题是POJ 2411的升级版。dp[i][j]表示长为i宽为j的方案数,打个表预处理一下。然后枚举列的切割方案,因为一共有m-1条竖线,因此有2^(m-1)种情况。cnt[i]表示按当前的列分割方案,宽为i的矩形的方案数,f[i]表示在当前列分割情况下,前i行的情况数,f[i]=cnt[i]-sigma{f[j]*cnt[i-j]}(0/*User:SmallLanguage:原创 2017-05-03 08:28:00 · 460 阅读 · 0 评论