听说3^n也能水过去。。

其实应该是个经典题,求图染色这个np问题。

把问题拆成独立集来进行dp可以在3^n之内水过去。

拆成独立集的时候就发现,等价与一个经典的反演dp问题

然后复杂度就变成了 n*n*2^n

另外,偷到一套头文件宏定义。

#include <math.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <set>
#include <map>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <iostream>
#include <algorithm>
#define pb push_back
#define fi first
#define se second
#define icc(x) (1<<(x))
#define lcc(x) (1ll<<(x))
#define lowbit(x) (x&-x)
#define debug(x) cout<<#x<<"="<<x<<endl
#define rep(i,s,t) for(int i=s;i<t;++i)
#define per(i,s,t) for(int i=t-1;i>=s;--i)
#define mset(g, x) memset(g, x, sizeof(g))
using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> veci;
const int mod=(int)1e9+,inf=0x3fffffff,rx[]={-,,,},ry[]={,,,-};
const ll INF=1ll<<;
const db pi=acos(-),eps=1e-; template<class T> void rd(T &res){
res = ; int ch,sign=;
while( (ch=getchar())!='-' && !(ch>=''&&ch<=''));
if(ch == '-') sign = ; else res = ch-'';
while((ch=getchar())>=''&&ch<='') res = (res<<)+(res<<)+ch-'';
res = sign?-res:res;
}
template<class T>void rec_pt(T x){
if(!x)return;
rec_pt(x/);
putchar(x%^);
}
template<class T>void pt(T x){
if(x<) putchar('-'),x=-x;
if(!x)putchar('');
else rec_pt(x);
}
template<class T>inline void ptn(T x){ pt(x),putchar('\n'); }
template<class T>inline void Max(T &a,T b){ if(b>a)a=b; }
template<class T>inline void Min(T &a,T b){ if(b<a)a=b; }
template<class T>inline T mgcd(T b,T d){ return b?mgcd(d%b,b):d; }//gcd模板,传入的参数必须是同一类型
//-------------------------------主代码--------------------------------------// int mat[];
int mark[<<];//记录是否为独立集
int dp[][<<];
int A[<<],B[<<];
int n;
void gao(int _A[],int _B[],int C[])
{
rep(i, , icc(n)){
A[i] = _A[i];
B[i] = _B[i];
}
//传说中的or卷积
rep(i, , n){
rep(j, , icc(n)){
if( (icc(i)&j)){
A[j] += A[j^icc(i)];
B[j] += B[j^icc(i)];
}
}
}
rep(i, , icc(n)) C[i] = A[i]*B[i];
//然后是逆着卷机
rep(i, , n){
rep(j, , icc(n)){
if( (icc(i)&j)){
C[j] -= C[j^icc(i)];
}
}
} }
int main()
{
int T;
rd(T);
while(T--)
{
rd(n);
rep(i, , n){
mat[i] = ;
rep(j, , n){
char tmp;
cin>>tmp;
if(tmp == '')
mat[i] |= icc(j);
}
}
//mset(dp, 0);
//然后求出独立集
mark[] = ;
rep(i, , n){
rep(j, , icc(i)){
dp[][icc(i)|j] = mark[icc(i)|j] = mark[j]==?(mat[i]&j)==:;
}
} //然后开始dp rep(i, , n){
if(dp[i][icc(n)-]) break;//这步优化很重要啊
gao(dp[i],mark,dp[i+]);
rep(j, , icc(n)) {
dp[i+][j] = (dp[i+][j]!=);
//pt(dp[i+1][j]); putchar(' ');
}
//puts("");
} ui ans = ;
ui tmp = ;
rep(i, , icc(n))
{
ui mj = ;
tmp *= ;
rep(j, , n+){
if(dp[j][i]!=){
mj = j;
break;
}
}
ans += mj*tmp;
}
ptn(ans);
}
return ;
} /*
//-----------Test Case------------// */

hdu5823(反演dp)的更多相关文章

  1. HDU - 5823:color II (状压DP 反演DP)

    题意:给定连通图,求出连通图的所有子图的颜色数. 一个图的颜色数,指最少的颜色数,给图染色,使得有边相邻的点之间颜色不同. 思路:首先想法是DFS枚举,然后计算颜色,发现对于给定图,求颜色不会求? 毕 ...

  2. 反演dp经典

    咋一看,至少要用3^n才能做到. 但. 首先定义: 可以发现只要求出a' b' 那么直接可以得出c' 那么如何求a'呢 //dp求a',其实就是分别用[0,n)来更新a' ; i < n; i+ ...

  3. CF809E Surprise me!(莫比乌斯反演+Dp(乱搞?))

    题目大意: 给你一棵树,树上的点编号为\(1-n\).选两个点\(i.j\),能得到的得分是\(\phi(a_i*a_j)*dis(i,j)\),其中\(dis(i,j)\)表示\(a\)到\(b\) ...

  4. BZOJ3622 已经没有什么好害怕的了 二项式反演+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3622 题解 首先显然如果 \(n - k\) 为奇数那么就是无解.否则的话,"糖果& ...

  5. Codeforces 285E - Positions in Permutations(二项式反演+dp)

    Codeforces 题目传送门 & 洛谷题目传送门 upd on 2021.10.20:修了个 typo( 这是一道 *2600 的 D2E,然鹅为啥我没想到呢?wtcl/dk 首先第一步我 ...

  6. 【CSA35G】【XSY3318】Counting Quests DP 拉格朗日反演 NTT

    题目大意 zjt 是个神仙. 一天,zjt 正在和 yww 玩猜数游戏. zjt 先想一个 \([1,n]\) 之间的整数 \(x\),然后 yww 开始向他问问题. yww 每次给 zjt 一个区间 ...

  7. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

  8. Codeforces.1139D.Steps to One(DP 莫比乌斯反演)

    题目链接 啊啊啊我在干什么啊.怎么这么颓一道题做这么久.. 又记错莫比乌斯反演式子了(╯‵□′)╯︵┻━┻ \(Description\) 给定\(n\).有一个初始为空的集合\(S\).令\(g\) ...

  9. P4859 已经没有什么好害怕的了(dp+二项式反演)

    P4859 已经没有什么好害怕的了 啥是二项式反演(转) 如果你看不太懂二项式反演(比如我) 那么只需要记住:对于某两个$g(i),f(i)$ ---------------------------- ...

随机推荐

  1. 性能tips

    Latch 闩 锁的平级 采样时间不能太长,太频繁 一般情况下,性能图应该是一种趋势图,看的是趋势,不看某些单个点 在压测收集数据时,可能多种工具收集到的性能数据有少许差异,原因: 网络延迟,导致收集 ...

  2. 乘号在python中的用法,用乘号将元素重复在列表中

    #里面:>>> a=['*5] >>> a ['] >>> a=['0,'*5] >>> a ['0,0,0,0,0,'] #外 ...

  3. PHP处理数据--excel与scv与json

    今天要处理两个excel.两个循环嵌套验证重复性.所以写了几个函数来处理20亿次的数据量. 一.把excel读出来,保存为json.利用phpexcel插件: <?php header(&quo ...

  4. 多条件查询(php+mysql) 租房子例子

    <body> <?php //多条件 $tiaojian2= " 2=2 "; $attr2 = ""; //判断区域 if(!empty($ ...

  5. AJAX和jQuery Ajax总结

    AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用,改善用户体验,实现无刷新效果的技术. 使用AJAX的优 ...

  6. C语言第5天

    [1]数组 多个数据类型相同元素的集合: [2]访问元素 从下标0开始,到N-1结束 [3]定义数组 <存储类型> <数据类型 > <数组名>[<表达式> ...

  7. Writing On-Error Trigger In Oracle Forms

    Suppose you want to handle an error in oracle forms and want to display custom error message for tha ...

  8. linux sudo apt-get用法详解

    APT的使用(Ubuntu Linux软件包管理工具一)apt-cache search # ------(package 搜索包)apt-cache show #------(package 获取包 ...

  9. Django 过滤器 实例

    实例1 safe让Html标签以及一些特殊符号(如<)生效,下面以例子说明: # value = '<b>CPT</b>' # 那么输出的时候,CPT就是加粗的,如果不加 ...

  10. application 网站计数器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...