1087: [SCOI2005]互不侵犯King

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4276  Solved: 2471
[Submit][Status][Discuss]

Description

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

Input

  只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)

Output

  方案数。

Sample Input

3 2

Sample Output

16

HINT

 

Source

/*
* @Author: LyuC
* @Date: 2017-09-03 21:24:43
* @Last Modified by: LyuC
* @Last Modified time: 2017-09-04 21:55:56
*/ /*
题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。 思路:类似八皇后问题,k>n的情况方案数为0,然后剩下的搜索解决 错误:这个和八皇后问题不一样,king只能攻击相邻一格,状压DP dp[i][j][k]表示第i行,j状态,已经按放k个棋子的状态 状态转移:dp[i][j][cnt=从j状态中的棋子数枚举到需要放的总的棋子数]+=
dp[i-1][上一行能满足下一行是j状态的状态][cnt-j状态的棋子数] 总的来说动态规划就是抽象出来状态,就很简单了
*/
#include <bits/stdc++.h> #define MAXN 15
#define MAXT 1024
#define MAXK 105
#define LL long long using namespace std; LL n,k;
LL dp[MAXN][MAXT][MAXK];//dp[i][j][k]表示第i行,第j种状态时,已经放下了k个棋子的方案数
LL tol;
LL cnt;
LL res; bool ok(LL x,LL y){//判断上行的状态是否满足条件
for(LL i=;i<n;i++){
if( (x&(<<i)) == ) continue; if(i==){
if( ( y&( <<i ) ) != || ( y&( <<(i+) ) ) !=)
return false;
}else if(i==n-){
if( ( y&( <<i ) ) != || ( y&( <<(i-) ) ) !=)
return false;
}else{
if( ( y&( <<(i-) ) ) != || ( y&( <<(i+) ) ) != || ( y&( <<i ) ) !=)
return false;
}
}
return true;
} LL judge(LL x){//判断这个状态是不是合格的
LL cur=;
for(LL i=;i<n;i++){
if( ( x&(<<i) ) !=){
if(i==){
if( ( x&( << (i+) ) )!=){
return -;
}
}else if(i==n-){
if( ( x&(<<(i+)) )!= || ( x&(<<(i-)) )!= ){
return -;
}
}else{
if( ( x&(<<(i-)) )!=){
return -;
}
}
cur++;
}
}
return cur;
} inline void init(){
memset(dp,,sizeof dp);
res=;
} int main(){
// freopen("in.txt","r",stdin);
init();
scanf("%lld%lld",&n,&k); tol=(<<n); for(LL i=;i<tol;i++){//初始化状态
cnt=judge(i);
if(cnt!=-){
dp[][i][cnt]=;
}
} for(LL i=;i<n;i++){//从第二行开始递推状态
for(LL j=;j<tol;j++){//枚举当前行的状态
cnt=judge(j);
if(cnt==-) continue;
for(LL l=;l<tol;l++){//枚举上一行的状态
if(ok(j,l)==false) continue;
for(LL d=cnt;d<=k;d++){
dp[i][j][d]+=dp[i-][l][d-cnt];
}
}
}
} for(LL i=;i<tol;i++){
res+=dp[n-][i][k];
}
printf("%lld\n",res);
return ;
}

1087: [SCOI2005]互不侵犯King的更多相关文章

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

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

  2. bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...

  3. 【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=1087 状压dp是第一次写啊,我也是才学TAT.状压dp一般都用一个值表示集合作为dp的一个状 ...

  4. bzoj[1087][SCOI2005]互不侵犯King

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

  5. 1087. [SCOI2005]互不侵犯King【状压DP】

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

  6. 【BZOJ】1087: [SCOI2005]互不侵犯King

    [算法]状态压缩型DP [题解]http://www.cnblogs.com/xtx1999/p/4620227.html (orz) https://www.cnblogs.com/zbtrs/p/ ...

  7. bzoj 1087: [SCOI2005]互不侵犯King【状压dp】

    显然是状压,设f[i][j][k]为1到i行选j个king,并且第i行状态为k的方案数,判断是否可行然后枚举转移即可 先把可行状态预处理出来会变快 #include<iostream> # ...

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

    题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.n<=9 思路:状压dp,dp[i][ ...

  9. BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

    [题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...

随机推荐

  1. 阿里云linux centos 一键部署web环境--图文详解

    一.购买阿里云服务器ECS 1,登录阿里云,选择阿里云服务器ECS 2,创建实例 或 3,选好配置 4,完成配置 注:记住用户名和密码 二.一键配置linux环境 1,下载xshell,安装成功后,建 ...

  2. 如何保存或读取数据(到android的data目录)利用context获取常见目录可优化代码

    读取用户信息 当然这里可以有多种返回值 非硬性

  3. Jquery Ajax type的4种类型

    Ajax type这个里面填什么呢?通常大家都会说get和post.那么还有2个是什么呢 $.ajax({ url: 'http://www.cnblogs.com/youku/', type: '' ...

  4. 中国移动飞信WAP登陆分析及脚本

    中国移动飞信WAP网页版 http://f.10086.cn/im5/ 用WAP飞信登录并向好友发送信息,同时用wireshark抓包. 1.过滤POST表单提交数据包(wireshark规则: ht ...

  5. 【京东账户】——Mysql/PHP/Ajax爬坑之用户登录

    一.引言 实现京东的账户项目,功能模块之一,用户登录.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.依据功能创建库.表.记录 创建库:jd 创建表:登录表 添加三条记录 CREATE ...

  6. JavaScript遍历对象-总结一

    原生JavaScript 遍历 1.for 循环遍历 let array1 = ['a','b','c']; for (let i = 0;i < array1.length;i++){ con ...

  7. 日期小demo

    有个项目需求是做个在日期上选择的,就是这种: 网上看了几个日期的demo都太厚重了,移植起来太麻烦,然后打算自己写. 就先写个简化的demo看看,主要有几个关键点: 首先要根据当前日期获取这个月有几天 ...

  8. 基于MyBatis3.0.6的基本操作介绍

    每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 .SqlSessionFactory本身是由SqlSessionFa ...

  9. Java历程-初学篇 Day02变量,数据类型和运算符

    一,数据类型 1,基础数据类型 整型 byte short int long 浮点型 float double 字符型 char 布尔类型 boolean 2,引用类型 String 字符串型 二,变 ...

  10. Jmeter连接mysql数据库

    1.下载 MySQL JDBC driver,并拷贝到jmeter的lib目录下. 2.创建JDBC Connection Configuration 需要填入的信息: Variable Name:M ...