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 ...
随机推荐
- 一款简洁而强大的前端框架JQUery—动画效果及剪刀石头布小游戏
jQuery是什么? jQuery是一个快速.简洁的JavaScript框架,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画 ...
- angularjs的几种常见写法
学习angularjs不久,遇见的angularjs的写法也是很多的感觉,今天就在这里记录一下,还有没见过的,继续学习中... angularjs 常用的几种种写法 1.链式: angular.mod ...
- FoxOne---一个快速高效的BS框架--数据访问(Dao)
FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...
- struts2一个和多个文件上传及下载
struts2的文件上传相比我们自己利用第三方jar包(commons-fileupload-1.2.1.jar commons-io-1.3.2.jar )要简单的多,当然struts2里面也是 ...
- Qt 打开文件的默认路径 QFileDialog::getOpenFileName()
为了说明QFileDialog::getOpenFileName()函数的用法,还是先把函数签名放在这里: QString QFileDialog::getOpenFileName ( ...
- mybatis 错误CGLIB is not available
### Error querying database. Cause: java.lang.IllegalStateException: Cannot enable lazy loading beca ...
- Bmob云IM实现头像更换并存入Bmob云数据库中(1.拍照替换,2.相册选择)
看图效果如下: 1.个人资料界面 2.点击头像弹出对话框 3.点击拍照 4.切割图片,选择合适的部分 5.点击保存,头像替换完毕,下面看从相册中选择图片. 6.点击相册 7.任选一张图片 8.切割图片 ...
- 687. Repeats spoj (后缀数组 重复次数最多的连续重复子串)
687. Repeats Problem code: REPEATS A string s is called an (k,l)-repeat if s is obtained by concaten ...
- 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage (Online Mirror, ACM-ICPC Rules, Teams Preferred)
题目链接:http://codeforces.com/problemset/problem/847/I I. Noise Level time limit per test 5 seconds mem ...
- thinkphp传参
use think\Request; 写法1: $parms=Request::instance()->param(); $param=$params['键值']; 写法2: $request= ...