互不侵犯(洛谷P1896)
题目:在N*N的棋盘里面放k个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
输入输出:输入N,K,输出有几种放置方法。(N<=9,k<=n^2)
样例输入输出:
入:3 2
出:16
这道题看范围就显然是状压dp了吧。。。
其实这道题和状压基础题玉米地(corn fields)非常相像,主要思路包括以下几点。
1.同一行不能有相邻的国王。
2.斜对角和正上正下不能有相邻的国王。
3.一共只有k个国王。
根据状压dp的一般尿性,肯定是要枚举状态的,那状态里面“ 1 ”,“ 0 ”表示什么含义呢?
肯定是“ 1 ”表示这一行这个位置放国王,“ 0 ”表示不放啊(废话++)
那思路就挺显然了。
1.枚举状态S,判断(S&(S<<1))==0,只有这样的S才是合法状态
2.枚举上一行状态s,判断((S&(s<<1))==0&&(S&(s>>1))==0&&(S&s)==0)分别对应右上,左上,正上。
3.主要麻烦的是这个k,怎么处理已经放了多少国王呢,这里我们可以用类似背包的思想,新开一维表示已经放入的国王数,然后由上一行较少国王数的状态转移过来(是不是很像背包的二维代码那个转移?可以把国王总数看作背包的容量,每一个国王就是背包中的一个个物品)
然后就没了。。。
附上全部代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e2+10;
typedef long long LL;
LL f[15][1<<10][80];
int lowbit(int x){return x&-x;}
int find(int x){
int cnt=0;
for(int i=x;i;i-=lowbit(i)){
cnt++;
}
return cnt;
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
int Max=(1<<n)-1;
f[0][0][0]=1;
for(int i=1;i<=n;i++){
for(int S=0;S<=Max;S++){
int cnt=find(S);
if((S&(S>>1))==0){
for(int s=0;s<=Max;s++){
if((S&s)==0 && ((S&(s<<1))==0) && (S&(s>>1))==0)
for(int kk=cnt;kk<=k;kk++){
//这里用kk保存这一行所放置的国王数,要注意,在S状态下,已经有cnt个国王放置了,所以要从这再往上遍历
f[i][S][kk]+=f[i-1][s][kk-cnt];
}
}
}
}
}
LL ans=0;
for(int S=0;S<=Max;S++){
ans+=f[n][S][k];
}
printf("%lld",ans);
return 0;
}
互不侵犯(洛谷P1896)的更多相关文章
- 1896 互不侵犯 洛谷 luogu
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...
- 洛谷 P1896 [SCOI2005]互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
- 洛谷P1896||bzoj1087 [SCOI2005]互不侵犯
bzoj1087 洛谷P1896 想了很久,太久没做状压都已经不会了... 状压每一行就好了 #include<cstdio> #include<algorithm> #inc ...
- 洛谷 P1896 互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 状压DP【洛谷P1896】 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 洛谷——P1896 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...
- 状压DP概念 及例题(洛谷 P1896 互不侵犯)
状压DP 就是状态压缩DP.所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态. 比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 1 ...
- BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2885 Solved: 1693[Submit][ ...
随机推荐
- Dos拒绝服务攻击DNS、SNMP、NTP放大攻击和slowhttptest攻击工具(三)
DNS放大攻击产生大流量的攻击方式 udpDNS放大效果-查询请求流量小,但响应流量可能非常巨大-dig ANY baidu.com @1.1.1.1 //向1.1.1.1的服务器查询域名解析,流量放 ...
- Robotframework自动化5-基础关键字介绍2
一:时间 1.获取当前时间 Get time 2.获取当月时间 ${yyyy} ${mm} ${day} Get Time year,month,day${time} Catenate SE ...
- 初等函数——指数函数(Exponential Function)
一般地,函数叫做指数函数,其中x是自变量,函数的定义域是R.
- MySQL隐式转换的坑
MySQL以以下规则描述比较操作如何进行转换: 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做 ...
- 【大数据】MapReduce开发小实战
Before:前提:hadoop集群应部署完毕. 一.实战科目:做一个Map Reduce分布式开发,开发内容为统计文件中的单词出现次数. 二.战前准备 1.本人在本地创建了一个用于执行MR的的文件, ...
- Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
1.简介 在性能测试中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化.JMeter配置元件与前置处理器都能帮助我们进行参数化,但是都有局限性,为了帮助我们能够更好 ...
- Java多线程--创建和使用线程池
使用线程池的目的 线程是稀缺资源,不能频繁的创建 解耦作用:线程的创建与执行完全分开,方便维护 将其放入一个池子中,可以给其他任务进行复用 优点 降低资源消耗,通过重复利用已创建的线程来降低线程创建和 ...
- SSH 框架常见错误
新手学习SSH框架的时候总会遇到很多问题,一碰到404 或者500错误就不知道怎么解决. 404错误是很常见的一个错误,如果没有用框架基本上只可能是没有这个路径或者文件,但是用了框架之后404的原因就 ...
- 计算(calc)
计算(calc) [题目描述] 小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有"(",")",& ...
- Java (四)APACHE Commons IO 复制文件
上一篇:Java (三)APACHE Commons IO 常规操作 例1:复制文件 1 import java.io.File; 2 import java.io.IOException; 3 4 ...