【Luogu】P1896互不侵犯King(状压DP)
2024-08-23 13:45:19
真是可恶,被数据范围坑了一把。想要一遍AC的希望破灭了……
以后大家在做状压DP的时候一定要开long long……
设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为k时的方案数。
先统计出k的二进制位有多少1,记为len,然后枚举o(1~(1<<n)-1),则状态转移方程有:
f[i][j][l]+=f[i-1][j-len][o];
注意判断两个状态是否合法。
j&(j>>1)不行,o&j不行,(o>>1)&j不行,(o<<1)&j也不行。当然o&(o>>1)更不行。
最后累计答案。
代码如下
#include<cstdio>
#include<cctype>
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} long long f[][][];
inline int getlen(long long x){
int ans=;
bool s;
while(x){
if(x&) ans++;
x>>=;
}
return ans;
} long long Max;
long long ans; inline bool check(long long x,long long y){
if(x&y) return ;
if((x>>)&y) return ;
if((x<<)&y) return ; return ;
} int main(){
f[][][]=;
int n=read(),k=read();
Max=(<<n)-;
for(int i=;i<=n;++i)
for(int j=;j<=k;++j)
for(int l=;l<=Max;++l){
int len=getlen(l);
if(len>j) continue;
if(l&(l>>)) continue;
for(int o=;o<=Max;++o){
if(check(o,l)) continue;
if(o&(o>>)) continue;
f[i][j][l]+=f[i-][j-len][o];
}
}
for(int i=;i<=Max;++i)
ans+=f[n][k][i];
printf("%lld",ans);
return ;
}
最新文章
- 图表插件Charts.js的使用
- web.xml添加编码过滤器
- 测试dns
- 多年前写的DataTable与实体类的转换,已放github
- [转] 国内外最全面和主流的JS框架与WEB UI库(强烈推荐)
- Ubuntu14.10+cuda7.0+caffe配置
- 跨域请求之JSONP 一
- M端页面-绝对定位布局
- BZOJ 2982: combination( lucas )
- 【C语言】超大数乘法运算
- Java 集合之LinkedList源码分析
- Build MySQL 5.7.4 in RedHat
- js 基础对象二
- Oracle Database Transaction Isolation Levels 事务隔离级别
- JAVA中正则表达式总结
- Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)
- python3 pickle模块
- Centos7下安装Docker
- 【题解】Luogu P4097 [HEOI2013]Segment
- Cheat Engine(简称CE)初体验
热门文章
- Windows 10下mysql 64位 安装(mysql-5.7.11-winx64安装)
- Android用Intent来启动Service报“java.lang.IllegalArgumentException: Service Intent must be explicit”错误的解决方法
- winform重绘
- MYSQL 中随机读取一条数据
- 用Hexo免费搭建你自己的博客
- 当互联网遇上家装,十大家装O2O混战
- Gym 100342E 	Minima (暴力,单调队列)
- CentOS7——防火墙设置
- 【page-monitor 前端自动化 下篇】 实践应用
- 精选30道Java笔试题附答案分析