【bzoj1087】【互不侵犯King】状压dp裸题(浅尝ACM-D)
[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 Output16
看数据范围,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)的更多相关文章
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
- bzoj1087 互不侵犯King 状压dp+bitset
题目传送门 题目大意:中文题面. 思路:又是格子,n又只有9,所以肯定是状压dp,很明显上面一行的摆放位置会影响下一行,所以先预处理出怎样的二进制摆放法可以放在上下相邻的两行,这里推荐使用bitset ...
- bzoj1087互不侵犯King——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087 水题... 然而犯了两个致命小错误,调了好半天...详见注释. 代码如下: #incl ...
- 互不侵犯king (状压dp)
互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...
- 【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 ...
- [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- 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
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- 互不侵犯_状压$dp$
如果有想学习状压\(dp\)的童鞋,请光临博客状压\(dp\)初学 互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
随机推荐
- 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4
孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...
- (原)Unreal Shader模块(一): 着色创建
一.着色加载 这里说的Shader是编译后的文件或内存 源码说明 --------------------------------------------------------------- ...
- 云效(阿里云)流水线 + nginx + uWsgi + flask + python3 基础环境搭建 --备忘
一.开发环境搭建 1.安装python3 yum -y groupinstall "Development tools" yum -y install zlib-devel bzi ...
- sharePreference的几个重点
一. SharePreferences是用来存储一些简单配置信息的一种机制,使用Map数据结构来存储数据,以键值对的方式存储,采用了XML格式将数据存储到设备中,文件存放在/data/data/&l ...
- JSP/Servlet Web 学习笔记 DayThree —— 实现一个登陆小界面
项目说明 利用JSP.HTML.JS实现了一个简易的登陆系统.根据前两天的所学,实现了如下功能: a)用户名.密码验证(不基于数据库,只做一个简单的表单数据获取并验证) b)页面访问次数统计 c)验证 ...
- Tomcat源码浅析
最近在学习tomcat源码,算是把tomcat的整个流程梳理通了. 从上图来看,tomcat把模块化使用到了极致,配合组件生命周期的管理,让代码看起来结构清晰,而且很容易进行业务扩展. 1.上图的接口 ...
- hdu 2510 符号三角形 (DFS+打表)
符号三角形 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- [UOJ#348][WC2018]州区划分
[UOJ#348][WC2018]州区划分 试题描述 小 \(S\) 现在拥有 \(n\) 座城市,第ii座城市的人口为 \(w_i\),城市与城市之间可能有双向道路相连. 现在小 \(S\) 要将这 ...
- 2.1 Python3.5安装以及爬虫需要的环境配置
之所以选用Python,是因为对于网络爬虫来说,Python是最好上手的一种语言.本文讲述的安装配置都是基于Windows的环境. 另外我想说的是,文中用到的下载链接尽量官方网站上的下载链接,这是我比 ...
- SHH框架的搭建
建立一个Web项目,然后导入如下包 l struts2包:在struts2-blank.war下的lib目录下,以及struts-2.3.15.1\lib下的struts和spring整合的插件包s ...