hdu5823(反演dp)
听说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)的更多相关文章
- HDU - 5823:color II (状压DP 反演DP)
题意:给定连通图,求出连通图的所有子图的颜色数. 一个图的颜色数,指最少的颜色数,给图染色,使得有边相邻的点之间颜色不同. 思路:首先想法是DFS枚举,然后计算颜色,发现对于给定图,求颜色不会求? 毕 ...
- 反演dp经典
咋一看,至少要用3^n才能做到. 但. 首先定义: 可以发现只要求出a' b' 那么直接可以得出c' 那么如何求a'呢 //dp求a',其实就是分别用[0,n)来更新a' ; i < n; i+ ...
- CF809E Surprise me!(莫比乌斯反演+Dp(乱搞?))
题目大意: 给你一棵树,树上的点编号为\(1-n\).选两个点\(i.j\),能得到的得分是\(\phi(a_i*a_j)*dis(i,j)\),其中\(dis(i,j)\)表示\(a\)到\(b\) ...
- BZOJ3622 已经没有什么好害怕的了 二项式反演+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3622 题解 首先显然如果 \(n - k\) 为奇数那么就是无解.否则的话,"糖果& ...
- Codeforces 285E - Positions in Permutations(二项式反演+dp)
Codeforces 题目传送门 & 洛谷题目传送门 upd on 2021.10.20:修了个 typo( 这是一道 *2600 的 D2E,然鹅为啥我没想到呢?wtcl/dk 首先第一步我 ...
- 【CSA35G】【XSY3318】Counting Quests DP 拉格朗日反演 NTT
题目大意 zjt 是个神仙. 一天,zjt 正在和 yww 玩猜数游戏. zjt 先想一个 \([1,n]\) 之间的整数 \(x\),然后 yww 开始向他问问题. yww 每次给 zjt 一个区间 ...
- LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)
写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...
- Codeforces.1139D.Steps to One(DP 莫比乌斯反演)
题目链接 啊啊啊我在干什么啊.怎么这么颓一道题做这么久.. 又记错莫比乌斯反演式子了(╯‵□′)╯︵┻━┻ \(Description\) 给定\(n\).有一个初始为空的集合\(S\).令\(g\) ...
- P4859 已经没有什么好害怕的了(dp+二项式反演)
P4859 已经没有什么好害怕的了 啥是二项式反演(转) 如果你看不太懂二项式反演(比如我) 那么只需要记住:对于某两个$g(i),f(i)$ ---------------------------- ...
随机推荐
- 2015-09-17 001 日志与对话框公用类_public
using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...
- python 使用 redis expire属性设置访问时间间隔
安装redis yum install redis 安装python redis扩展 pip install redis 启动redis,并设定开机自动启动 service redis start c ...
- 2016年11月25日 星期五 --出埃及记 Exodus 20:16
2016年11月25日 星期五 --出埃及记 Exodus 20:16 "You shall not give false testimony against your neighbor.不 ...
- java实现UDP协议传输DatagramSocket
摘自:http://blog.csdn.net/wintys/article/details/3525643/ Server端. package com.topca.server; import ja ...
- iOS- 详解文本属性Attributes
1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSFontAttributeName : [UIFont systemFontOfSize:_fontS ...
- .Net大文件上传(转--待验证)
几种常见的方法,本文主要内容包括: 第一部分:首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采 ...
- SQL十进制和十六进制相互转换
CREATE FUNCTION ufn_ConvertInt2Hex ( @Num BIGINT ) ) AS BEGIN /************************************* ...
- FreeSWITCH第三方库(其他)的简单介绍(三)
FreeSWITCH使用了大量的第三方库,本文档主要介绍关联相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 视频相关 ...
- netstat -ano,查看已占用端口,结束已被占用的端口,ntsd,关闭任务管理器杀不了的进程
cmd——回车,输入netstat -ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不 ...
- 如何设计点击点击一个div,其他div做出对应反应,以及获取一个节点下的子节点
<div id="show"> <div>1</div> <div>2</div> <div>3</d ...