bzoj 1556 墓地秘密 —— 状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1556
预处理出两个障碍四个方向之间的距离(转弯次数),就可以状压DP了;
但预处理很麻烦...参考了TJ...:https://blog.csdn.net/senyelicone/article/details/56668048
用 spfa ,记录当前位置带一个朝向,然后转移时判断一下如果朝向不同就+1;
最后再从起点出发同样预处理一下,作为初始状态即可;
注意读入的地图上的 '#' 不仅是机关石,还有墙...所以不能忽略。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int const maxn=105,maxm=20,inf=0x3f3f3f3f; int n,m,T,f[1<<16][maxm][5],dis[maxm][5][maxm][5],d[maxn][maxn][5]; int dx[5]={0,1,0,-1},dy[5]={1,0,-1,0},xx[maxm],yy[maxm],sx,sy,ans; bool vis[maxn][maxn],roc[maxn][maxn]; queue<pair<int,int> >q; bool ck(int x,int y){return x>0&&y>0&&x<=n&&y<=m;} void spfa(int nw,int x,int y,int dr) {if(roc[x][y]||!ck(x,y))return;while(q.size())q.pop();memset(d,0x3f,sizeof d);q.push(make_pair(x,y)); vis[x][y]=1;for(int k=0;k<4;k++)d[x][y][k]=0;while(q.size()){int nx=q.front().first,ny=q.front().second; q.pop(); vis[nx][ny]=0;for(int i=0;i<4;i++){int tx=nx+dx[i],ty=ny+dy[i];if(roc[tx][ty]||!ck(tx,ty))continue;// for(int j=0;j<4;j++)if(d[tx][ty][j]>d[nx][ny][i]+(i!=j)){d[tx][ty][j]=d[nx][ny][i]+(i!=j);if(!vis[tx][ty])vis[tx][ty]=1,q.push(make_pair(tx,ty));}}}for(int i=1;i<=T;i++)for(int j=0;j<4;j++)//从j撞击xi,yi {int tx=xx[i]+dx[j],ty=yy[i]+dy[j],tmp=inf;for(int k=0;k<4;k++)tmp=min(tmp,d[tx][ty][k]+(tx+dx[k]!=xx[i]||ty+dy[k]!=yy[i]));//反向dis[nw][dr][i][j]=tmp; } } int main() {scanf("%d%d%d",&n,&m,&T);char ch[maxn];for(int i=1;i<=n;i++){cin>>ch;for(int j=0;j<m;j++)if(ch[j]=='#')roc[i][j+1]=1;}for(int i=1;i<=T;i++){scanf("%d%d",&xx[i],&yy[i]); // roc[x][y]=1;//'#'表示墙,不一定是机关石!!! }for(int i=1;i<=T;i++)for(int j=0;j<4;j++)spfa(i,xx[i]+dx[j],yy[i]+dy[j],j);scanf("%d%d",&sx,&sy);spfa(T+1,sx,sy,4);memset(f,0x3f,sizeof f); f[0][T+1][4]=0;int mx=(1<<T); ans=inf;for(int s=0;s<mx;s++)for(int i=1;i<=T+1;i++)for(int j=0;j<=4;j++) if(f[s][i][j]!=inf)for(int k=1;k<=T;k++)for(int l=0;l<4;l++)f[s|(1<<(k-1))][k][l]=min(f[s|(1<<(k-1))][k][l],f[s][i][j]+dis[i][j][k][l]+1);for(int i=1;i<=T;i++)for(int j=0;j<4;j++)ans=min(ans,f[mx-1][i][j]);printf("%d\n",ans);return 0; }
转载于:https://www.cnblogs.com/Zinn/p/9399643.html
bzoj 1556 墓地秘密 —— 状压DP相关推荐
- BZOJ 1556 墓地秘密
Description 费尽周折,终于将众将士的残骸运送到了KD军事基地地底层的大型墓地入口.KD的伙伴和战友们都参加了这次重大的送葬仪式.右边是一扇敞开的大门,进去便是墓地了,左边是一堵凹进去的墙, ...
- BZOJ 2073: [POI2004]PRZ( 状压dp )
早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
- bzoj 2073:[POI2004]PRZ 状压DP
Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍 ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...
最新文章
- Java设计模式学习06——静态代理与动态代理(转)
- 文件服务器 之 ProFTPD+MySQL 认证
- 二十不惑,三十而已|网易互联网人的“焦虑必杀技”
- linux下c语言抓包库libpcap
- Java split拆分使用竖线为分隔符的字符串方法
- rpm升级时spec文件执行的流程
- python空类型用什么表示_python中怎么表示空值
- BundleFusion那些事儿
- 自己动手架设linux下Web服务器(图)5
- js设置radio选中
- (97)Verilog HDL:秒灯设计
- BlockingQueue - LinkedBlockingQueue常用API
- 虚拟系统管理VSM提高服务器整合率
- HTTP权威指南—基础部分
- 剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染
- nginx做小程序外链跳转_微信小程序跳转到其他网页(外部链接)的实现方法
- HttpWebRequest 无法连接到远程服务器
- 苹果手机互传一键换机
- python读取pdf内容转word_【python】python实现PDF转word
- PHP递归的三种方式
热门文章
- python-excel读取代码1
- kettle中Pan kitchen用法及bat写法
- java i 原理_Java I/O模型及其底层原理
- python3 django 中文乱码_python3 wsgi服务和响应数据中文乱码问题
- JS键盘事件对象之keyCode、charCode、which属性对比
- mybatis-generator扩展教程系列 -- 自定义配置参数修改DAO,Mapper文件后缀
- Android课程---如何用网格视图做出手机桌面APP
- 架构之重构的12条军规(上)
- MongoDB学习之简介、下载、安装
- 阿里旺旺2012自动登录