BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)
[SCOI2005]互不侵犯King
【题目描述】
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
【输入】
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
【输出】
方案数。
【样例输入】
3 2
【样例输出】
16
分析:
经典的状压DP题目,可我竟然调了很长时间都没对,后来发现是DP枚举范围错了,直接枚举到最大情况导致答案大得离谱,所以透彻理解算法很重要。
其它懒得写了。
代码1(第一次写的代码很丑,还很多余地在每个二进制首位增添一个1......):
program king;
var
f:array[..,..,..]of int64;
a:array[..,..]of ..;
sum1,w:array[..]of longint;
g:array[..,..]of boolean;
h:array[..]of boolean;
n,i,m,j,k,u,v,l,num,num1:longint;
procedure work(x:longint);
var i,c,y:longint;
begin
i:=x; c:=;
while i> do
begin
a[x,c]:=i mod ; if a[x,c]= then begin inc(sum1[x]); if c> then y:=-c+; end;
i:=i div ;
c:=c-;
end;
dec(sum1[x]); w[x]:=y;
end;
begin
readln(n,k);num1:=;num:=;
for i:= to n do num:=num*;
num:=num1+num-;
for i:=num1 to num do
begin
work(i);
end;
for u:=num1 to num do
for v:=num1 to num do
for l:= to do begin g[u,v]:=true;
if (a[u,l]=)and(((a[v,l-]=)and(l>))or(a[v,l]=)or(a[v,l+]=)) then begin g[u,v]:=false;break; end;
if (a[v,l]=)and(((a[u,l-]=)and(l>))or(a[u,l]=)or(a[u,l+]=)) then begin g[u,v]:=false;break; end;
end;
fillchar(f,sizeof(f),);
for i:=num1 to num do begin h[i]:=true;
for j:= to do
if ((a[i,j]=)and(((a[i,j-]=)and(j>))or(a[i,j+]=))) then begin h[i]:=false; break; end;
if h[i]=true then f[,i,sum1[i]]:=;
end;
for i:= to n+ do
for j:= to k do
for u:=num1 to num do
if (sum1[u]<=j)and(h[u]=true) then
for v:=num1 to num do
if (sum1[v]+sum1[u]<=j)and(h[v]=true) then
begin
if g[u,v]=true then f[i,u,j]:=f[i,u,j]+f[i-,v,j-sum1[u]];
end;
writeln(f[n+,num1,k]);
end.
代码2(改进的代码,用了一些位运算,比第一次好看一点):
program king;
var
f:array[..,..,..]of int64;
sum1:array[..]of longint;
g:array[..,..]of boolean;
h:array[..]of boolean;
n,i,m,j,k,u,v,l,t,num:longint;
begin
readln(n,k);
fillchar(g,sizeof(g),false);
fillchar(h,sizeof(h),false);
fillchar(f,sizeof(f),);
num:=;
for i:= to n do num:=num*; num:=num-;
for i:= to num do
if i and (i shr )= then
begin
j:=i;t:=;
while j> do begin t:=t+j and ; j:=j shr ; end;
sum1[i]:=t; h[i]:=true;
end;
for i:= to num do if h[i]=true then
for j:= to num do if h[j]=true then
if (i and j=)and(i and (j shr )=)and(j and (i shr )=) then g[i,j]:=true;
for i:= to num do if h[i]=true then f[,i,sum1[i]]:=;
for i:= to n+ do
for j:= to k do
for u:= to num do if (h[u]=true)and(sum1[u]<=j) then
for v:= to num do if (h[v]=true)and(sum1[u]+sum1[v]<=j) then
if g[v,u]=true then
inc(f[i,u,j],f[i-,v,j-sum1[u]]);
writeln(f[n+,,k]);
end.
BZOJ 1087:[SCOI2005]互不侵犯King(状压DP)的更多相关文章
- 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
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...
- [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- 互不侵犯king (状压dp)
互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- bzoj1087 互不侵犯King 状压dp+bitset
题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...
- BZOJ 1087 [SCOI2005]互不侵犯King(状压DP)
题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.n<=9 思路:状压dp,dp[i][ ...
- [SCOI2005]互不侵犯(状压DP)
嗝~算是状压DP的经典题了~ #\(\mathcal{\color{red}{Description}}\) 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻 ...
随机推荐
- 【BZOJ3925】[ZJOI2015] 地震后的幻想乡(状压期望DP)
点此看题面 大致题意: 有\(n\)个点和\(m\)条边,每条边的权值是一个\(0\sim1\)的随机实数,要你用\(n-1\)条边将图联通,问这\(n-1\)条边中边权最大值的期望最小值. 提示 这 ...
- javaweb基础(30)_EL函数库
一.EL函数库介绍 由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用. 这些EL函数在JSTL开发包中进行描述,因此在JSP页 ...
- 03_15_interface
03_15_interface 1. 接口 接口是抽象方法和常量值的定义的集合. 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现. 2. 接口特性 接口 ...
- 解决使用Application Loader上传ipa提示“上传appstore失败”
试了好多次使用Application Loader上传ipa,一直提示上传失败,用其他mac电脑却可以,那就是环境有问题,笔者试过重装xcode,都无法解决问题, 查看日志类似是jdk版本问题,换了所 ...
- swiper动画效果
参考swiper官方网站:http://www.swiper.com.cn/ Swiper常用于移动端网站的内容触摸滑动: 结构展示: 纯javascript打造的滑动特效插件,面向手机.平板电脑 ...
- AngularJS1.X版本双向绑定九问
前言 由于工作的原因,使用angular1.x版本已经有一段时间了,虽然angualr2升级后就完全重构了,但每个版本存在也有一定的道理.话不多说,进入正题. 1.双向绑定的原理是什么? Angual ...
- C/C++程序基础 (三)引用和指针
引用 引用变量与原始变量共享同一地址 int &a = b 则 &a = &b 引用类型的变量必须在声明时初始化,且不可以更换指向变量 常量的引用必须是常量引用,非常量的引用可 ...
- 千万不要错过这几道Python面试题,Python面试题No16
第1题: python下多线程的限制以及多进程中传递参数的方式? python多线程有个全局解释器锁(global interpreter lock),简称GIL,这个GIL并不是python的特性, ...
- Python 枚举类源码解析
1. EnumMeta 元类编程,生成类的类,可以动态生成类. 用法: type(name, bases, dict) name -> 类名: str bases -> 基类: tuple ...
- python代码notepad++不变色问题。
原来是文档后缀名是.txt造成的,应该改成.py,疏忽了...