hdu-5823-color II-状压DP-枚举子集的子集

http://acm.hdu.edu.cn/showproblem.php?pid=5823

给你一个无向图,然后要枚举所有点的子集的最小染色方案数,然后输出 ∑ans[i]*233^i mod 2^32

n<=18


我们先预处理出所有的独立集 2^n*n*n


枚举每一个子集,对于这个子集(k个点)我们要求它的最小染色方案数的复杂度是2^k:


对于当前子集state,去枚举其所有的子集S2,先判断是否为一个独立集,如果是,则dp[state]=min(dp[state],dp[S2^state]+1);

因为染色=划分独立集,最优解一定是若干个独立集

而我们枚举了所有的独立集,这样得到的答案必然是最优解。


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 18;
int dp[1<>n;
        getchar();
        for (int i=0; i


你可能感兴趣的:(动态规划,状压dp)