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并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么 ...
随机推荐
- sdut 2153 Clockwise (2010年山东省第一届ACM大学生程序设计竞赛)
题目大意: n个点,第i个点和第i+1个点可以构成向量,问最少删除多少个点可以让构成的向量顺时针旋转或者逆时针旋转. 分析: dp很好想,dp[j][i]表示以向量ji(第j个点到第i个点构成的向量) ...
- Qt 串口编程学习1
1.测试设备:USB 转串口 将RX和TX短接 2.开发环境:windows 1安装Qt for windows 2测试,新建项目编译 出现问题 Cannot find file: C:\Docume ...
- Compute Mean Value of Train and Test Dataset of Caltech-256 dataset in matlab code
Compute Mean Value of Train and Test Dataset of Caltech-256 dataset in matlab code clc;imPath = '/ho ...
- RedHat Linux下利用sersync进行实时同步数据
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://linux5588.blog.51cto.com/65280/772054 拓扑图 ...
- dll--二进制层面的复用
积木式思想其实是很自然的一个过程,从c的库函数到C++的标准库,再到dll.com.com+都是这种思想推动下的结果,和现实生活中的人们的思维方式并无二致,只不过软件是在一个虚拟的世界中,并分化出许多 ...
- Linux-Memcache分布式部署方案(magent代理解决单点故障)
Memcached的特点 Memcached作为高速运行的分布式缓存服务器具有以下特点. 1. 协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式, 而是使用简单的基于文本的协议 ...
- postgresql downgrade issue
Q: Dear Support Team, If we use ubuntu server to install postgresql9.4, how can we keep original dat ...
- python--flask使用
Flask是一个使用 Python 编写的轻量级 Web 应用框架.下面我将使用Flask框架,创建一个简单的html页面示例. 1.项目的目录结构如下所示:exweb\ uniqueenv\ a ...
- 017. ADO.NET Connection和command及DataReader
ADO.NET主要包括Connection , command , DataReader, DataSet, DataAdapter5个对象, 通过这5个对象可以对数据库进行查询, 添加, 修改及删除 ...
- JS动态广告浏览
<script language="JavaScript"> function addEventSimple(obj,evt,fn){ if(obj.addEventL ...