sgu233 little kings
题目大意: 有n*n的棋盘上放k个国王。国王可以攻击与它相邻的八个格子。现在要使国王不相互攻击,有多少种放置的方案数。一个格子不能放两个国王。
n<=10,k<=n*n。
分析:简单的状态压缩DP。f[i][state][j]表示第i行放置国王的状态为state,前i行一共放了j个国王的方案数,state为位压缩表示的状态,某位为1,表示该处放了国王,为0表示没有放。合法的state状态数是有限的,所以,可以预处理出一行当中所有合法的state状态,保存在数组中。
f[i][p1][j]=∑(f[i-1][p2][j-cnts[state]]) {(state[p2]&state[p1])==0&&((state[p2]>>1)&state[p1]==0)&&((state[p2]<<1)&state[p1]==0)}
最后的答案即为∑f[n][j][k] {枚举j}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,num=,s[],c[];
long long f[][][];
void dfs(int i,int state,int cnt)
{
if(i>=n)
{s[++num]=state;
c[num]=cnt;
return;
}
dfs(i+,state<<,cnt);
if(state&)return;
dfs(i+,(state<<)+,cnt+);
}
int main()
{
while(scanf("%d%d",&n,&k)!=-)
{
memset(f,,sizeof f);
num=;
dfs(,,);
for(int i=;i<=n;i++)
{
for(int j=;j<=num;j++)
{if(i==)f[i&][j][c[j]]=;
else
for(int p=c[j];p<=k;p++)
{
f[i&][j][p]=;
for(int x=;x<=num;x++)
{
if(c[x]+c[j]<=p&&(s[x]&s[j])==&&((s[x]&(s[j]<<))==)&&((s[x]&(s[j]>>))==))
f[i&][j][p]+=f[!(i&)][x][p-c[j]];
}
}
}
}
long long ans=;
for(int j=;j<=num;j++)
ans+=f[n&][j][k];
printf("%I64d\n",ans);
}
}
sgu233 little kings的更多相关文章
- POJ2699 The Maximum Number of Strong Kings
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2102 Accepted: 975 Description A tour ...
- UESTC 1851 Kings on a Chessboard
状压DP... Kings on a Chessboard Time Limit: 10000ms Memory Limit: 65535KB This problem will be judged ...
- POJ 2699 The Maximum Number of Strong Kings Description
The Maximum Number of Strong Kings Description A tournament can be represented by a complete graph ...
- 状压DP SGU 223 Little Kings
题目传送门 /* 题意:n*n的矩阵,放置k个king,要求king互相不能攻击,即一个king的8个方向都没有另外的king,求方案个数 状态压缩DP:dp[i][num[j]][s] 代表在第i行 ...
- 【POJ2699】The Maximum Number of Strong Kings(网络流)
Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...
- POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
The Maximum Number of Strong Kings Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2488 ...
- kings(骑士)解题报告
kings(骑士) Time Limit5000 ms Memory Limit131072 KBytes Description 用字符矩阵来表示一个8x8的棋盘,'.'表示是空格,'P'表示 ...
- 【POJ2699】The Maximum Number of Strong Kings(二分,最大流)
题意: 有n个队伍,两两都有比赛 知道最后每支队伍获胜的场数 求最多有多少队伍,他们战胜了所有获胜场数比自己多的队伍,这些队伍被称为SK N<=50 思路:把每个队伍和它们两两之间的比赛都当做点 ...
- 【poj2699】 The Maximum Number of Strong Kings
http://poj.org/problem?id=2699 (题目链接) 题意 给出1张有向完全图.U->V表示U可以打败V并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么 ...
随机推荐
- Notes of Principles of Parallel Programming: Peril-L Notation - TODO
Content 1 syntax and semantic 2 example set 1 syntax and semantic 1.1 extending C Peril-L notation s ...
- SM30维护视图添加按钮
转自http://blog.csdn.net/tsj19881202/article/details/7517232 遇到某需求,要求维护sm30的视图时,能加上排序按钮. 基本参考: http:// ...
- clipToBounds
最近在开发H5平台的iOS移动侧,遇到些问题,随手记录下来. 1 UIView的clipToBounds 窗口裁剪,默认是NO,表示如果父窗口的大小已经不足以显示子窗口,也不进行裁剪,而是显示,但这时 ...
- C陷阱与缺陷 1
1,符号之间的空白被忽略 符号中间不能嵌入空白 2,词法分析中的贪心法 a---b 和 a-- -b相同 和 a- --b不同 1 a=b/*p //根据贪心法 /*被解释成 注释符,便不再往下读,直 ...
- c 深度剖析 1
1.register register 变量必须是能被CPU寄存器所接受的类型(32 位机器 寄存器为32位),必须是单个的值,长度小于或等于整形的长度 不能用&来获取register 变量的 ...
- Oracle数据库五种约束
oracle 数据库 数据表的5个约束类型:1.主键约束2.外键约束3.唯一约束4.检查约束5.非空约束 主键约束:用来唯一标示表中的一个列,一个表中的主键约束只能有一个,但是可以在一个主键约束中包含 ...
- https那些事儿
(一)SSL/TLS协议运行机制的概述 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获 ...
- java的nio之:java的nio系列教程之SocketChannel
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. ...
- js的数组操作 splice
原文:点击打开链接 1.作用:从指定位置删除部分元素并增加新的元素 1.1.该方法返回值是被删除的元素组成的数组 1.2.splice是直接 ...
- 【转】IOS图像拉伸解决方案
原文网址:http://www.cnblogs.com/ios8/p/ios-pic-lashen.html UIButton实现背景拉伸,即图片两端不拉伸中间拉伸的办法有如下两种: 第一种方法很简单 ...