题目描述

这里

在\(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之互不侵犯的更多相关文章

  1. 【状压dp】互不侵犯KING

    互不侵犯KING Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3866  Solved: 2264[Submit][Status][Discuss] ...

  2. 互不侵犯_状压$dp$

    如果有想学习状压\(dp\)的童鞋,请光临博客状压\(dp\)初学 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八 ...

  3. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  4. 【状压DP】bzoj1087 互不侵犯king

    一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...

  5. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

  6. bzoj1087 互不侵犯King 状压dp+bitset

    题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...

  7. 互不侵犯king (状压dp)

    互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...

  8. BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)

    [SCOI2005]互不侵犯King [题目描述] 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...

  9. 状压入门--bzoj1087: [SCOI2005]互不侵犯King【状压dp】

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...

随机推荐

  1. Linux ACL权限查看与设定

    getfacl 文件名,可以查看文件的acl权限 setfacl [选项] 文件名,可以设定文件的acl权限,例如:setfacl -m u:boduo:rx /project/ 这时候,创建了bod ...

  2. java创建透明背景的PNG图片加自定义文字水印

    人在码上走,需求天天有.这不,今天前端让我返回一个带自定义水印的背景图片.一通google,有现成的代码,但是基本是直接在源图上添加水印,生成出来的文字样式也没有控制好,看来又只有自己造轮子了. 过程 ...

  3. Java学习的一般过程

    伴随着科学技术的不断发展,世界开始走向信息化.网络化.大数据化.自然而然,计算机专业变得十分热门.尽管如此,计算机专业人才对社会来说仍然是供不应求,当然,这里指的是高层次技术人才.因此,对于我们这些占 ...

  4. mysql 大表mysqldump迁移方案

    场景 一张历史表product_history 500万数据,凌晨的才会将正式表的数据迁移到历史表,此次需求将历史表迁移到一个更便宜的数据库实例进行存储. 条件 1.此表不是实时写,凌晨才会更新 2. ...

  5. Python 抓取网页tag操作

    1. 获取操作tag 获取操作tag的接种方式: soup.find_all(name=None, attrs={}, recursive=True, text=None, limit=None, * ...

  6. Say Something About Of Flash Android

    Why am I need say something about of flash android? It's at my college life when I touch flash andro ...

  7. centos7上安装redis以及PHP安装redis扩展(一)

    1.关闭防火墙: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewal ...

  8. api请求允许跨域的问题

    让api请求允许跨域 header("Access-Control-Allow-Origin:*");header('Access-Control-Allow-Credential ...

  9. Lombok介绍和使用

    1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how ...

  10. Android学习笔记添加ActionItem

    ActionItem概念 案例仿知乎首页的ActionBar 一.编写布局文件activity_main.xml <?xml version="1.0" encoding=& ...