1087: [SCOI2005]互不侵犯King

Time Limit: 10 Sec Memory Limit: 162 MB

Submit: 2337 Solved: 1366

[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

刚学状压DP的蒟蒻A的第一道状压,一开始写的朴素状压,发现各种蛋疼根本就不对,(毕竟是个沙茶),于是搜了下题解(怪我啦),发现还是too young,too simple;高端的预处理让我膜拜,对于状压DP这方面现在是真的水的不行,还需要多多练习啊

此处传送门:http://blog.csdn.net/qpswwww/article/details/34516641

高端讲解!

傻×的程序附上:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int plan[1000]={0},map[1000][1000]={0},num[1000]={0};
long long f[10][100][1000]={0};
int n,k,zz=0; void dfs(int king,int loc,int state)
{
plan[++zz]=state;
num[zz]=king;
if ((king>=(n+1)/2) || (king>=k)) return;
for (int i=loc+2; i<=n; i++)
dfs(king+1,i,state+(1<<(i-1)));
} int main()
{
scanf("%d%d",&n,&k);
dfs(0,-1,0);
for (int i=1; i<=zz; i++)
for (int j=1; j<=zz; j++)
if ((plan[i] & plan[j]) || (plan[i]>>1 & plan[j]) || (plan[i]<<1 & plan[j]))
map[i][j]=map[j][i]=0;
else
map[i][j]=map[j][i]=1;
for (int i=1; i<=zz; i++)
f[1][num[i]][i]=1;
for (int i=2; i<=n; i++)
for (int j=0; j<=k; j++)
{
for (int t=1; t<=zz; t++)
{
if (num[t]>j) continue;
for (int l=1; l<=zz; l++)
if (map[l][t] && num[l]+num[t]<=j)
f[i][j][t]+=f[i-1][j-num[t]][l];
}
}
long long ans=0;
for (int i=1; i<=zz; i++)
ans+=f[n][k][i];
printf("%lld",ans);
return 0;
}

BZOJ-1087 互不侵犯King 状压DP+DFS预处理的更多相关文章

  1. 互不侵犯king (状压dp)

    互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...

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

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

  3. bzoj1087 互不侵犯King 状压dp+bitset

    题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...

  4. 【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 ...

  5. [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)

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

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

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

  7. BZOJ 1087 互不侵犯King 状态压缩DP

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1087 题目大意; 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国 ...

  8. bzoj1087互不侵犯King——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087 水题... 然而犯了两个致命小错误,调了好半天...详见注释. 代码如下: #incl ...

  9. BZOJ 1087 互不侵犯king

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

随机推荐

  1. scp: command not found如何解决

    今天给一台新的服务器,准备源码安装一些软件,需要使用scp复制文件时报错如下:-bash: scp: command not found 解决办法如下:安装scp的软件包:# yum install ...

  2. 用SqlParameter 给SQL传递参数

    1.数据访问层 using的用法: 01.可以using System;导命名控空间 02.using 的语法结构 using(变量类型  变量名 =new 变量类型()) { } 案例: 03.us ...

  3. IDEA 滚动条跳动问题

    关掉有道词典的 “屏幕取词” 和 “划词翻译”

  4. 一篇搞定RSA加密与SHA签名|与Java完全同步

    基础知识 什么是RSA?答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding?答:padding即填充方式,由于RSA加密算法 ...

  5. 图解Js event对象offsetX, clientX, pageX, screenX, layerX, x区别

    通过 3 张图和 1 张表格,轻松区别 JavaScript Event 对象中的offsetX, clientX, pageX, screenX, layerX, x等属性. 一.测试代码如下: & ...

  6. [Elixir009]像GenServer一样用behaviour来规范接口

    1.Behaviour介绍 Erlang/Elixir的Behaviour类似于其它语言中的接口(interfaces),本质就是在指定behaviours的模块中强制要求导出一些指定的函数,否则编译 ...

  7. Python基础 - 获取N天前的日期

    获取今天前第N天的日期 from datetime import datetime from datetime import timedelta def get_date(days=N): retur ...

  8. Objective-c文件读取

  9. Linux内核分析——第八周学习笔记20135308

    第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...

  10. 《Linux及安全》实验安排

    SEED(SEcurity EDucation)项目由雪城大学杜文亮教授2002年创立,为计算机教学提供一套信息安全实验环境,目前已开发超过30个实验,涵盖广泛的安全原理,被全世界数百个高校采用. 实 ...