[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54329606

向大(hei)佬(e)势力学(di)习(tou)

Description

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

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

Input

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

Output

  方案数。

Sample Input

3 2

Sample Output

16

看数据范围,1<=N<=9,什么东西的的数据范围这么小啊,总不可能是放水,所以想来也是状态压缩dp了

说道状压dp,刚开始学习的时候打的是salesman,是一道用记忆化搜索的题,害我进了一个误区,竟以为状压都要用记忆化搜索。然而状压的实质只是将状态用二进制的数字表示,结合进各种dp中去。

这类题的状态通常有优化,枚举的2^N的数字中有很大一部分是不合法的,如果每次都枚举完再判断的话有可能会超时,所以可以用一个state数组来储存合法状态(但要注意state[i]中的i不是二进制状态)

另外灵活应用位运算来判断合法不合法也是一个重要的技巧

目前我所总结到的:

1、& 可以判断是否在同一列

2、<< 和>> 可以挪动,与其他运算符结合使用可以判断斜方向上的东西

3、| 并上两行的,通常用于三行的dp

代码(有我的笨判断方法,好在对时间复杂的要求不高)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std; const int N=15; struct Node{
int state,cnt;
}a[600];
int sz=0;
int n,K;
ll dp[N][600][N*N]; bool check(int state){
bool bj=0;
int now;
while(state){
now=(state&1);
if(bj==0&&now==1) bj=1;
else if(bj==1){
if(now==1) return false;
bj=0;
}
state>>=1;
}
return true;
/*if(state&(state<<1)) return false;
if(state&(state>>1)) return false;
return true;*/
}
int lowbit(int x){
return x&(-x);
}
int count(int state){
int now,rt=0;
while(state){
rt++;
state-=lowbit(state);
}
return rt;
}
bool check2(int a,int b){
if((a&b)!=0) return false;
if(check((a|b))==false) return false;
/*if((a&(b<<1))!=0) return false;
if((a&(b>>1))!=0) return false;*/
return true;
}
int main(){
scanf("%d%d",&n,&K);
for(int i=0;i<(1<<n);i++){
if(check(i)){
a[sz].state=i;
a[sz].cnt=count(i);
sz++;
}
}
for(int i=0;i<sz;i++){
dp[1][i][a[i].cnt]=1;
}
for(int i=2;i<=n;i++){
for(int j=0;j<sz;j++){
for(int k=0;k<=K;k++){//0个也是可能的
for(int g=0;g<sz;g++){
if(check2(a[j].state,a[g].state)&&k-a[j].cnt>=0) dp[i][j][k]+=dp[i-1][g][k-a[j].cnt];
}
}
}
}
ll ans=0;
for(int i=0;i<sz;i++){
ans+=dp[n][i][K];
}
printf("%lld",ans);//long long
return 0;
}

总结:

最近总死在long long 上,下手前要先思考一下可能会达到的数据范围

【bzoj1087】【互不侵犯King】状压dp裸题(浅尝ACM-D)的更多相关文章

  1. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 互不侵犯_状压$dp$

    如果有想学习状压\(dp\)的童鞋,请光临博客状压\(dp\)初学 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八 ...

  10. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

随机推荐

  1. Python 快速部署安装所需模块

    需求 我们需要在拷给别人或者提交至服务器也用同样的模块,好保持和开发的一样,所以我们需要自己手动写配置模块信息. 方法 在根目录下创建一个 requirements.txt  文件 里面写 模块名== ...

  2. vue实现数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  3. django的F和Q对象

    F表达式和Q表达式: # 示例模型如下 class Book(models.Model): """图书模型""" name = models ...

  4. java 中基本类型与字符串之间的互相转换

    1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...

  5. 软考——(5)计算机系统之CPU组成

    其实我们很早就接触过计算机系统方面的知识,但是还是出现印象不深,理解不清楚的现象,丢分很严重.这部分的知识需要我们花功夫去理解,因为很多东西我们接触不到,比如校验码.码制等,如果你不去理解而是去记,就 ...

  6. 【bzoj2044】三维导弹拦截 dp+二分图最大匹配

    题目描述 n个物品,第i个位置有ai.bi.ci三种属性.每次可以选出满足$\ a_{p_i}<a_{p_{i+1}}\ ,\ b_{p_i}<b_{p_{i+1}}\ ,\ c_{p_i ...

  7. Codeforces Round #389 (Div. 2) 752F(树的权值重心)

    题目大意 给定2k个队伍分别住在2k个城市里,需要设定若干个城市,然后选取2个队伍要在它们的最短路径上设一个城市作为休息站 要求设立最少的休息站,然后输出如何安排2个队伍 首先若干个其实就是在坑人,实 ...

  8. 区间(interval)

    区间(interval) 题目描述 zht有一个长度为n的排列P,现在zht想知道,有多少个由连续整数组成的区间[l,r][l,r]可以由PP中的两个区间[a,b],[c,d]拼出,其中1≤a≤b&l ...

  9. 在HTML网页上打印需要的内容

    首先在head里面加入下面一段js代码: function preview(oper) { if (oper < 10) { bdhtml = window.document.body.inne ...

  10. mvvm实现

    https://segmentfault.com/a/1190000006599500 http://blog.csdn.net/pur_e/article/details/53066275