状压DP
文章平均质量分 84
围巾的ACM
啊啊什么时候也能成为一个大牛啊
展开
-
HDU1074 Doing Homework 状态压缩DP
Doing HomeworkTime Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescriptionIgnatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every原创 2015-12-06 16:56:01 · 406 阅读 · 0 评论 -
HDU 4462 Scaring the Birds(状态压缩枚举)
思路:考虑K只有10,压缩一下然后暴力枚举即可,注意的是放稻草人的点是不需要被覆盖的#includeusing namespace std;const int maxn = 150;#define INF 1e9int r[maxn],c[maxn],vis[maxn][maxn],R[maxn];int a[maxn];int n,k;int main(){原创 2016-07-23 21:04:51 · 385 阅读 · 0 评论 -
hdu5816 Hearthstone(状压DP)
思路:令dp[s]为当前手牌为s状态时候的方案数,那么假设手上有x张A,y张B,那它的下一个状态就是2*x-(x+y)+1张牌,然后从小到大枚举S更新状态,当前方案贡献的排列数就是dp[s]*(n+m-x-y)! 不过这样会T成狗,我预处理了一下阶乘表以及预处理了0到1#includeusing namespace std;#define LL long longint n,m,原创 2016-08-10 00:11:39 · 770 阅读 · 0 评论 -
POJ 3311 Hie with the Pie(状压DP)
思路:一个类似TSP的问题,只是每个点可以走多次,floyd预处理一下两两之间的距离。求最短距离。城市只有10个,所以可以考虑状态压缩,令dp[s][i]为到了i点时状态为s的最短距离,那么dp[s][i]=min(dp[s][i],dp[ss][j]+d[j][i])#include#include#includeusing namespace std;#define原创 2016-08-11 01:55:26 · 384 阅读 · 0 评论 -
HDU 3001 Travelling(状态压缩DP)
思路:类似TSP问题,不过每个点可以经过不超过两次,那么就可以考虑用三进制来压缩状态,先预处理出每个数的三进制的第j位是什么,然后其他就和TSP类似的坑点:有重边#includeusing namespace std;const int maxn = 60000;#define inf 0x3f3f3fint three[]={0,1,3,9,27,81,243,729,2187,原创 2016-08-11 10:45:45 · 350 阅读 · 0 评论 -
hdu5823 color II(状态压缩DP)
题意:给你一个图G,求每个子图的最少染色数思路:每个子图的染色问题,可以看成是找每个子图的独立集问题(两两顶点互不相邻的图叫独立集),可以先枚举每个状态,然后枚举每个顶点,表示以这个顶点为起始的子图,再枚举每个顶点,表示这个顶点和上面那个顶点所构成的图是一个独立集,预处理出所有非法的状态,即他们之间有边。 令dp[s]为子图S已经染色的最少染色数,那么有dp[s]=mi原创 2016-08-11 23:39:05 · 1009 阅读 · 2 评论 -
FZU 2218 Simple String Problem(状压DP)
思路:注意到k只有16,比较显然的想到状压DP,令dp[s]为s这个状态的最长长度,那么需要枚举反面的子集,显然复杂度会爆炸,有一个很巧妙的地方是将dp[s]表示为s这个状态及其子集的最长长度,这样可以大大减少复杂度,最终复杂度为O(n^2+k*2^k)#include#include#includeusing namespace std;int dp[1<<16];char原创 2016-11-01 22:31:37 · 414 阅读 · 0 评论