[BZOJ 1054][HAOI 2008]移动玩具 状态压缩
考试的时候一看是河南省选题,觉得会很难,有点不敢想正解。感觉是个状压。但是一看是十年前的题,那怂什么!
直接把十六个数的状态压进去,因为个数是不变的,所以状态枚举的时候只要找数目一样的转移即可。而且只需找这一位为1的转移即可。因为个数不变,所以转移0到1和转移1到0是一样的。
就是简单的模拟转移,找它的上下左右对应的那一位是否为0,如果是,那么就是从此为是0,那一位是1转移过来的,取个min即可。
因为枚举是暴力枚举,而不是按状态顺序枚举,所以可能在一次枚举的时候有的状态没有转移到,那就重复处理此过程,直到都转移到即可。
比较暴力。能过就行。hhh。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define pos2(i,a,b) for(int i=(a);i>=(b);i--)
int f[1<<16];
int count(int x)
{
int sum=0;
while(x)
{
if(x&1)
sum++;
x>>=1;
}
return sum;
}
int tmp,cnt,ans;
int flag[20];
int main()
{
freopen("movea.in","r",stdin);
freopen("movea.out","w",stdout);
memset(f,0x7f,sizeof(f));
//cout<<(7^2)<<endl;
pos(i,1,16)
{
char x;
cin>>x;
int xx=x-'0';
if(xx==1)
{
tmp|=(1<<((17-i)-1));
flag[i]=1;
}
}
pos(i,1,16)
{
char x;
cin>>x;
int xx=x-'0';
if(xx==1)
ans|=(1<<((17-i)-1));
}
cnt=count(tmp);
f[tmp]=0;
while(f[ans]>10000000)
{
pos(i,0,(1<<16)-1)
{
if(count(i)==cnt)
{
pos(j,1,16)
{
int qian=(1<<((17-j)-1));
if(qian&i)
{
if(((j%4)!=1)&&((1<<((18-j)-1))&i)==0)
{
int temp;
temp=(1<<((18-j)-1))|i;
temp^=qian;
f[i]=min(f[i],f[temp]+1);
}
if((j%4)&&((1<<((16-j)-1))&i)==0)
{
int temp;
temp=(1<<((16-j)-1))|i;
temp^=qian;
f[i]=min(f[i],f[temp]+1);
}
if(j<=12&&((1<<((13-j)-1))&i)==0)
{
int temp;
temp=(1<<((13-j)-1))|i;
temp^=qian;
f[i]=min(f[i],f[temp]+1);
}
if(j>=5&&(((1<<(21-j)-1))&i)==0)
{
int temp;
temp=(1<<((21-j)-1))|i;
temp^=qian;
f[i]=min(f[i],f[temp]+1);
}
}
}
}
}
}
cout<<f[ans];
//while(1);
return 0;
}
[BZOJ 1054][HAOI 2008]移动玩具 状态压缩的更多相关文章
- 【BZOJ 1054】 [HAOI2008]移动玩具
Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动 ...
- bzoj 1087 [SCOI2005]互不侵犯King 状态压缩dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Descripti ...
- BZOJ 1097: [POI2007]旅游景点atr 状态压缩+Dijkstra
题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不 ...
- [HAOI 2005][BZOJ 1054] 移动玩具
先贴一波题面 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2288 Solved: 1270 Descr ...
- bzoj 1054: [HAOI2008]移动玩具 bfs
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...
- bzoj 1054 移动玩具
题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1054 移动玩具 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想 ...
- BZOJ 1054 [HAOI2008]移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1388 Solved: 764[Submit][Statu ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- BZOJ 1087状态压缩DP
状态压缩DP真心不会写,参考了别人的写法. 先预处理出合理状态, 我们用二进制表示可以放棋子的状态,DP[I][J][K]:表示现在处理到第I行,J:表示第I行的状态,K表示现在为止一共放的棋子数量. ...
随机推荐
- 闭包中this指向window的原因
var t={ b:1, w:function a(){ var b=2; alert(this.b); //弹出t对象的b属性 alert(b); //弹出a函数的b变量 return functi ...
- Hugo快速搭建Blog
以往我们搭建blog要么学习一个编程语言+Web开发框架,要么使用现成的blog系统(如WordPress).其实我们还可以使用Hugo.Hugo是由Go语言实现的静态网站生成器,它不需要数据库,所以 ...
- Windows10 Enterprise版本周年更新问题
安装Windows10的时候,蛋疼选择了企业版本,导致后来周年更新遇到了蛋疼的问题. 首先是无法接收到周年更新的推送.记得首个周年更新的时候,等了大半年都没有.后来使用了易升进行更新,可以检测到,但是 ...
- Linux系统安全配置基线
一:共享账号检查 配置名称:用户账号分配检查,避免共享账号存在 配置要求:1.系统需按照实际用户分配账号: 2.避免不同用户间共享账号,避免用户账号和服务器间通信使用的账号共享. 操作指南:参考配置操 ...
- PHP xmapp 下面安装 Composer-Setup.exe
1.打开PHP配置文件E:\xampp\php\php.ini确认以下模块已开启(移除前面的分号). extension=php_openssl.dll, (php.ini文档里面开启一次就OK了) ...
- redis内存管理
Redis主要通过控制内存上线和回收策略来实现内存管理. 1. 设置内存上限 redis使用maxmemory参数限制最大可用内存.限制的目的主要有: 用户缓存场景,当超出内存上限maxmemory时 ...
- Netty ByteBuf源码分析
Netty的ByteBuf是JDK中ByteBuffer的升级版,提供了NIO buffer和byte数组的抽象视图. ByteBuf的主要类集成关系: (图片来自Netty权威指南,图中有一个画错的 ...
- Chrome浏览器扩展开发系列之十九:扩展开发示例
翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...
- MessageBoxButtons.OKCancel的选择事件
private void 退出ToolStripMenuItem1_Click(object sender, EventArgs e) { DialogResult resault = Message ...
- 浅谈viewport
我们通常在写移动端页面时,往往都会在html页面中加入这样一段话 <meta name="viewport" content="width=device-width ...