Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 3040  Solved: 1786

[Submit][Status][Discuss]

Description

  在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上

左下右上右下八个方向上附近的各一个格子,共8个格子。

Input

  只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)

Output

  方案数。

Sample Input

3 2

Sample Output

16

【题解】

设f[i][j][k]表示在第i行的放国王的序列为k,然后前i行放了j个国王的方案数;

f[i][j][k] = ∑[i-1][j-count[k]][pre_zhuangtai];

然后就是pre_zhuangtai 要怎么和k状态配对呢?

就是说你怎么知道这两行的国王不会发生冲突?

可以用dfs预处理出来。

然后用碉堡了的位运算来获取不合法的关系。剩下的就是合法的了。

1

1

1

01

01

10

像上面3个都是不合法的会发现

x<<1 x>>1 x 分别和y进行&运算。如果大于0.就是不合法的了。

记录下某两个状态是不是合法的就可以了。

【代码】

#include <cstdio>
#include <cstring> const int MAXN = 101; int n, k, n_zt = 0, zt[MAXN], count[MAXN];
long long f[10][101][101];
bool can[MAXN][MAXN]; void dfs(int num, int pre, int zhuangtai)
{
n_zt++;
zt[n_zt] = zhuangtai;
count[n_zt] = num;
if (num >= k)
return;
for (int i = pre + 2; i <= n; i++)
dfs(num + 1, i, zhuangtai + (1 << (i - 1)));
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
memset(can, true, sizeof(can));
scanf("%d%d", &n, &k);
dfs(0, -1, 0);
for (int i = 1; i <= n_zt; i++)
for (int j = 1; j <= n_zt; j++)
if ((zt[i] & zt[j]) || ((zt[i] << 1) & zt[j]) || ((zt[i] >> 1) & zt[j]))
can[j][i] = can[i][j] = false;
for (int i = 1; i <= n_zt; i++)
f[1][count[i]][i] = 1;
for (int i = 2;i <= n;i++)//枚举当前是第几行。
for (int j = 0;j <= k;j++)//枚举当总共放了多少个国王
for (int now = 1; now <= n_zt; now++)//枚举当前行的状态是什么
{
if (j < count[now])//如果枚举当前行状态的国王数目大于当前枚举的则跳过。
continue;
for (int prezt = 1; prezt <= n_zt; prezt++)//枚举前一行的状态是什么
if (can[prezt][now] && count[prezt] + count[now] <= j)
f[i][j][now] += f[i - 1][j - count[now]][prezt];
//如果这两行符合规则.且前一行的国王的数目加上这一行的国王的数目小于等于
//当前枚举的车的数目;
//这一行贡献了count[now]个国王。则前i-1行贡献了j-count[now]个国王.
}
long long ans = 0;
for (int i = 1; i <= n_zt; i++)
ans += f[n][k][i];
printf("%lld\n", ans);
return 0;
}

【58.75%】【BZOJ 1087】[SCOI2005]互不侵犯King的更多相关文章

  1. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  2. bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...

  3. bzoj[1087][SCOI2005]互不侵犯King

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

  4. bzoj 1087: [SCOI2005]互不侵犯King【状压dp】

    显然是状压,设f[i][j][k]为1到i行选j个king,并且第i行状态为k的方案数,判断是否可行然后枚举转移即可 先把可行状态预处理出来会变快 #include<iostream> # ...

  5. BZOJ 1087 [SCOI2005]互不侵犯King(状压DP)

    题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.n<=9 思路:状压dp,dp[i][ ...

  6. BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

    [题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...

  7. 1087: [SCOI2005]互不侵犯King

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4276  Solved: 2471[Submit][ ...

  8. 【BZOJ】1087: [SCOI2005]互不侵犯King(状压dp)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=1087 状压dp是第一次写啊,我也是才学TAT.状压dp一般都用一个值表示集合作为dp的一个状 ...

  9. 【BZOJ】1087: [SCOI2005]互不侵犯King

    [算法]状态压缩型DP [题解]http://www.cnblogs.com/xtx1999/p/4620227.html (orz) https://www.cnblogs.com/zbtrs/p/ ...

  10. 1087. [SCOI2005]互不侵犯King【状压DP】

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...

随机推荐

  1. 2019-8-31-dotnet-方法名-To-和-As-有什么不同

    title author date CreateTime categories dotnet 方法名 To 和 As 有什么不同 lindexi 2019-08-31 16:55:58 +0800 2 ...

  2. 洛谷P2607 骑士

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...

  3. Windows中查看PowerShell版本和virbox版本,vagrant 版本

    我并不是很熟悉什么是PowerShell,但是有种直觉是:如果想在Windows中使用系统自带的功能取代bash shell,PowerShell或许是比DOS批处理更好的选择.不过,从头开始再来一门 ...

  4. (六)IO流之过滤流

    过滤字节流FilterInputStream和FilterOutputStream BufferedInputStream和BufferedOutputStream    需要使用已存在的节点流来构造 ...

  5. hdu4325 线段树 成段更新

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #def ...

  6. php配置文件php.ini中文详解

    转自:http://www.cnblogs.com/hbl/archive/2008/02/15/1069367.html [PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而p ...

  7. 实践分享:开始用Cordova+Ionic+AngularJS开发App

    http://www.cocoachina.com/webapp/20150707/12395.html 本文是一篇关于我本人在使用Cordova+Ionic以及AngularJS开发移动App的过程 ...

  8. SDUT-3344_数据结构实验之二叉树五:层序遍历

    数据结构实验之二叉树五:层序遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一个按先序输入的字符序列,如abd ...

  9. vue事件获取事件对象,vue获取事件源,vue event.currentTarget

    js的事件,如点击事件,可以直接用this获取事件对象,而jQuery可以使用$(this)来获取事件对象.vue必须借助事件的 event 对象 的 currentTarget 才能获取事件对象 v ...

  10. MySQL性能分析, mysql explain执行计划详解

    MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...