1087: [SCOI2005]互不侵犯King
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
Sample Output
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的更多相关文章
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- 【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1087 状压dp是第一次写啊,我也是才学TAT.状压dp一般都用一个值表示集合作为dp的一个状 ...
- bzoj[1087][SCOI2005]互不侵犯King
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- 1087. [SCOI2005]互不侵犯King【状压DP】
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...
- 【BZOJ】1087: [SCOI2005]互不侵犯King
[算法]状态压缩型DP [题解]http://www.cnblogs.com/xtx1999/p/4620227.html (orz) https://www.cnblogs.com/zbtrs/p/ ...
- bzoj 1087: [SCOI2005]互不侵犯King【状压dp】
显然是状压,设f[i][j][k]为1到i行选j个king,并且第i行状态为k的方案数,判断是否可行然后枚举转移即可 先把可行状态预处理出来会变快 #include<iostream> # ...
- BZOJ 1087 [SCOI2005]互不侵犯King(状压DP)
题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.n<=9 思路:状压dp,dp[i][ ...
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
随机推荐
- day12<常见对象+>
常见对象(Scanner的概述和方法介绍) 常见对象(Scanner获取数据出现的小问题及解决方案) 常见对象(String类的概述) 常见对象(String类的构造方法) 常见对象(String类的 ...
- AngularJS -- Bootstrap(启动器)(转载)
AngularJS -- Bootstrap(启动器) 点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ Bootstrap(初始化) ...
- es6函数的rest参数和拓展运算符(...)的解析
es6的新特性对函数的功能新增加了rest参数和...的拓展运算符.这是两个什么东西呢? 先来看一个问题:如何获取一个函数除了定义的参数之外的其他参数?传统的做法是借助函数的arguments关键字来 ...
- [mysql] ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES).
用mysql -u root -p显示ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YE ...
- HDFS源码分析之NameNode(1)————启动过程
源码:2.8.0 入口类:org.apache.hadoop.hdfs.server.namenode.NameNode main方法会调用createNameNode 创建 NameNode 实例, ...
- 分布式系统中生成全局ID的总结与思考
世间万物,都有自己唯一的标识,比如人,每个人都有自己的指纹(白夜追凶给我科普的,同卵双胞胎DNA一样,但指纹不一样).又如中国人,每个中国人有自己的身份证.对于计算机,很多时候,也需要为每一份数据生成 ...
- End up with More Teams UVA - 11088
End up with More Teams Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu ...
- cannot be cast to javax.servlet.Servlet
在第一次开发Maven项目时,maven环境和仓库以及eclipse都和讲师讲解的一样,可是却遇到下面这个问题: java.lang.ClassCastException: servlet.UserS ...
- 定制自己的vue模版
前言 使用vue这个框架已经陆陆续续做了好几个项目了,不知不觉也已经在公司呆了4个月,转正了.时间如水...(省略一万字)./咳-不瞎扯了,公司是直接用的官方脚手架生成项目,官方模版没有vuex,ax ...
- 通过npm写一个cli命令行工具
前言 如果你想写一个npm插件,如果你想通过命令行来简化自己的操作,如果你也是个懒惰的人,那么这篇文章值得一看. po主的上一篇文章介绍了定制自己的模版,但这样po主还是不满足啊,项目中我们频繁的需要 ...