【BZOJ】1087: [SCOI2005]互不侵犯King
【算法】状态压缩型DP
【题解】http://www.cnblogs.com/xtx1999/p/4620227.html (orz)
https://www.cnblogs.com/zbtrs/p/6189240.html
dp[i][j][k]为前i行已经放了j个国王并且第i行的状态为k(二进制)的方案数。
状态左移右移预处理两行合法。
dp[i][j][k] = Σdp[i-1][j - num[k]][p]
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=,e2=;
long long f[maxn][e2][maxn*maxn];
int n,mk,num[e2],king[e2],ok[e2][e2];
bool selfcheck(int a)
{
return !(a&(a>>));
}
int calc(int a)
{
int cyc=;
while(a)
{
if(a&)cyc++;
a=a>>;
}
return cyc;
}
bool check(int a,int b)
{
if((a&b)||(a&(b<<))||(a&(b>>)))return ;
return ; }
int main()
{
scanf("%d%d",&n,&mk);
int all=(<<n)-,tot=;
for(int i=;i<=all;i++)
{
if(selfcheck(i))
{
num[++tot]=i;
king[tot]=calc(i);
//printf("%d\n",i);
}
}
for(int i=;i<=tot;i++)
for(int j=;j<=tot;j++)
if(!ok[i][j])if(check(num[i],num[j]))
ok[i][j]=ok[j][i]=;//,printf("%d %d\n",i,j);
f[][][]=;
for(int i=;i<=n-;i++)
for(int j=;j<=tot;j++)
for(int k=;k<=mk;k++)
if(f[i][j][k])
for(int p=;p<=tot;p++)
if(ok[j][p]&&k+king[p]<=mk)
f[i+][p][k+king[p]]+=f[i][j][k];
long long ans=;
for(int i=;i<=tot;i++)
ans+=f[n][i][mk];
printf("%lld",ans);
return ;
}
【BZOJ】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
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- 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 ...
- 1087: [SCOI2005]互不侵犯King
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4276 Solved: 2471[Submit][ ...
- 【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1087 状压dp是第一次写啊,我也是才学TAT.状压dp一般都用一个值表示集合作为dp的一个状 ...
- 1087. [SCOI2005]互不侵犯King【状压DP】
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...
随机推荐
- SpringMVC项目中获取所有URL到Controller Method的映射
Spring是一个很好很强大的开源框架,它就像是一个容器,为我们提供了各种Bean组件和服务.对于MVC这部分而言,它里面实现了从Url请求映射控制器方法的逻辑处理,在我们平时的开发工作中并不需要太多 ...
- CCF——数位之和201512-1
问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 输出一个整数,表示答案. 样例输入 20151220 样例输出 13 样例说明 20151220的各位数字 ...
- PAT 甲级 1005 Spell It Right
https://pintia.cn/problem-sets/994805342720868352/problems/994805519074574336 Given a non-negative i ...
- 【Linux 命令】- more和less
more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b ...
- Spring Cloud Sleuth服务跟踪
监控 使用zipkin(https://zipkin.io/) 监控服务构建: (普通的springBoot项目) <!--引入的zipkinServer依赖--> <depende ...
- UVA11625_Lines of Containers
题意很简单,给你一个n*m的矩阵,现在问你这个矩阵能否变为标准矩阵(即数字从小到大),如果能最少需要几步呢? 其实是个赤果果的水题.记得暑假安叔也出过一个类似的题目,那个好像是在codeforces上 ...
- java map 当key相同的时候 最后一个覆盖最近的一个值
- HDU 6035 Colorful Tree(dfs)
题意:一棵有n个点的树,树上每个点都有颜色c[i],定义每条路径的值为这条路径上经过的不同颜色数量和.求所有路径的值的和. 可以把问题转化为对每种颜色有多少条不同的路径至少经过这种颜色的点,然后加和. ...
- BZOJ 1216 操作系统(堆)
用堆模拟题目中的操作即可. # include <cstdio> # include <cstring> # include <cstdlib> # include ...
- bzoj2818 Gcd(欧拉函数)
Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...