状压DP之互不侵犯
题目描述
这里
在\(N*N\) 的棋盘里面放\(k\)个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
输入格式
只有一行,包含\(N,K\)两个数 。
输出格式
所得方案数。
样例
样例输入
3 2
样例输出
16
思路
我们可以想到,对于当前行的影响有当前行的状态,上一行的状态(因为国王的攻击范围可以从上一行包括到这一行),以及当前行的国王数,那么我们可以用一个三维数组\(f[n][k][1<<n-1]\),用来代表第一维代表前\(i\)行(\(1<i<=n\)),第二维代表在前\(i\)行放\(j(0<=j<=k)\)个国王,第三维代表第\(i\)行的状态,对于f数组的初始化,只需要将\(f[0][0][0]\)初始化为1即可;
对于上一行的判断,我们现在用S表示当前行状态,用s表示上一行状态,那我们就有\(if(S&s || (S<<1)&s || (S>>1)&s)continue\),显然,我们还应该对当前行以及上一行进行判断(当前行和上一行的国王不能),显然有\(if((s<<1)&s)continue\),\(if((S>>1)&S)continue\);
对于当前行的状态我们有\(f[i][j][S]+=f[i-1][j-Q(S)][s]\)(Q函数用来求改状态下的国王个数,即1的个数,需要用到lowbit)。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=(1<<9)-1;
long long f[10][100][maxn];
int lowbit(int x){
return x&-x;
}
int Q(int x){
int cnt=0;
for(int i=x;i;i-=lowbit(i))cnt++;
return cnt;
}
int main(){
int n,k;
cin>>n>>k;
int maxs=1<<n;
f[0][0][0]=1;
for(int i=1;i<=n;i++){//枚举每一行
for(int S=0;S<maxs;S++){//枚举当前行状态
if((S>>1)&S)continue;
for(int s=0;s<maxs;s++){//枚举上一行的状态
if((s<<1)&s)continue;//去掉上一行排斥情况(可以无)
if(S&s || (S<<1)&s || (S>>1)&s)continue;//去掉当前行去上一行冲突情况
for(int j=Q(S);j<=k;j++){//枚举前i行的国王个数
f[i][j][S]+=f[i-1][j-Q(S)][s];
}
}
}
}
long long ans=0;
for(int i=0;i<=maxs;i++){
ans+=f[n][k][i];
}
cout<<ans;
}
状压DP之互不侵犯的更多相关文章
- 【状压dp】互不侵犯KING
互不侵犯KING Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3866 Solved: 2264[Submit][Status][Discuss] ...
- 互不侵犯_状压$dp$
如果有想学习状压\(dp\)的童鞋,请光临博客状压\(dp\)初学 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- 【状压DP】bzoj1087 互不侵犯king
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- bzoj1087 互不侵犯King 状压dp+bitset
题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...
- 互不侵犯king (状压dp)
互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...
- BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)
[SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 状压入门--bzoj1087: [SCOI2005]互不侵犯King【状压dp】
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...
随机推荐
- Cordova+ionic+angular 项目从 UIWebView 更换为 WKWebView ,通过IOS审核
当前 cordova-ios 最新版本 5.1.1 新版本 cordova-ios 将删除 UIWebView 代码中的所有引用.WKWebView 将是 Cordova 的默认 Web 视图. ...
- .NET Web应用中为什么要使用async/await异步编程
前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...
- k8s学习-安全
4.8.安全 4.8.1.概念 一些内容可参考4.6.2.Secret的内容 说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群 ...
- epic无法登陆怎么办【百分百解决】
epic无法登陆怎么办(感谢吾爱破解吧www.52pjb.net)站长提供的文章教程以及解决思路,谢谢大佬,更详细的解决办法可以参考下他的网站解决的方法实例! epic登陆不上去怎么办?随着GTA5免 ...
- idea同时选中多个相同的内容并编辑
原文链接: 首先选中你需要编辑的内容,然后Ctrl+R屏幕上会出现如下的操作栏 第一个框是查询并选中所有相同的内容第二个框是输入你要修改的内容,最后点击Replace all,就可以把所有内容替换.
- pip未找到
命令终端运行 sudo easy_install pip 安装成功后最后会显示 Installed /Library/Python/2.7/site-packages/pip-9.0.1-py2.7. ...
- el-checkbox实现全选与单选
实现目的:实现全选与多选,点击确定的时候获取每个值的id传给后台 1.HTML <el-checkbox v-model="checkAll" @change="h ...
- Java学习笔记7(IO)
IO(输入输出) IO流按照操作数据的不同,分为字节流和字符流,按照数据传输方向分为输入流和输出流. 字节流 计算机中,所有文件都是以二进制(字节)形式存在,IO流中针对字节的输入输出提供了一系列的流 ...
- WeChair项目Alpha冲刺(8/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第八天 昨日进展: 前端:安排页面美化,设计实名认证 后端:用户信息通过dao层存储数据库 数据库:修改数据表属性,与后端部署数据库交互 2.今日安 ...
- 网易java高级开发课程 面对上亿数据量,网易用啥技术?