bzoj 1556: 墓地秘密【状压dp+spfa】
显然是状压,显然不可能把所有格子压起来
仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节……这里写挂了好几次),然后设f[s][i]为碰完的机关石状态为s,现在在有用格子的第i个的最小停下次数,转移按照套路即可
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=105,dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int n,m,t,a[N][N],f[70005][65],x[N],y[N],bx,by,dis[N][N][5],id[N][5],tot;
char c[N][N];
bool v[N][N];
struct qwe
{
int x,y;
qwe(int X=0,int Y=0)
{
x=X,y=Y;
}
};
bool ok(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m&&c[x][y]!='#';
}
void spfa(int sx,int sy,int s)
{//cerr<<sx<<" "<<sy<<endl;
if(!ok(sx,sy))
return;
// cerr<<s<<endl;
queue<qwe>q;
memset(dis,0x3f,sizeof(dis));
dis[sx][sy][0]=dis[sx][sy][1]=dis[sx][sy][2]=dis[sx][sy][3]=0;
v[sx][sy]=1;
q.push(qwe(sx,sy));
while(!q.empty())
{
int x=q.front().x,y=q.front().y;
q.pop();
v[x][y]=0;
for(int j=0;j<4;j++)
if(ok(x+dx[j],y+dy[j]))
for(int k=0;k<4;k++)
if(dis[x+dx[j]][y+dy[j]][k]>dis[x][y][j]+(j!=k))
{
dis[x+dx[j]][y+dy[j]][k]=dis[x][y][j]+(j!=k);
if(!v[x+dx[j]][y+dy[j]])
{
v[x+dx[j]][y+dy[j]]=1;
q.push(qwe(x+dx[j],y+dy[j]));
}
}
}
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
a[s][id[i][j]]=min(a[s][id[i][j]],dis[x[i]+dx[j]][y[i]+dy[j]][k]+(dx[j]+dx[k]!=0||dy[j]+dy[k]!=0));
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
scanf("%s",c[i]+1);
for(int i=1;i<=t;i++)
scanf("%d%d",&x[i],&y[i]);
scanf("%d%d",&bx,&by);
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
id[i][j]=++tot;
memset(a,0x3f,sizeof(a));
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
spfa(x[i]+dx[j],y[i]+dy[j],id[i][j]);//,cerr<<x[i]<<" "<<dx[j]<<" "<<y[i]<<" "<<dy[j]<<endl;
spfa(bx,by,tot+1);
// for(int i=1;i<=tot+1;i++)
// {
// for(int j=1;j<=tot+1;j++)
// cerr<<a[i][j]<<" ";
// cerr<<endl;
// }
memset(f,0x3f,sizeof(f));
f[0][tot+1]=0;
for(int i=0,len=(1<<t)-1;i<=len;i++)
for(int j=1;j<=tot+1;j++)
for(int k=1;k<=tot;k++)
f[i|(1<<((k-1)/4))][k]=min(f[i|(1<<((k-1)/4))][k],f[i][j]+a[j][k]+1);
int ans=1e9;
for(int i=1;i<=tot;i++)
ans=min(ans,f[(1<<t)-1][i]);
printf("%d\n",ans);
return 0;
}
bzoj 1556: 墓地秘密【状压dp+spfa】的更多相关文章
- bzoj 1556 墓地秘密 —— 状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1556 预处理出两个障碍四个方向之间的距离(转弯次数),就可以状压DP了: 但预处理很麻烦.. ...
- 洛谷P2761 软件补丁问题(状压DP,SPFA)
题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )
状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...
- BZOJ 2073: [POI2004]PRZ( 状压dp )
早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...
- HDU 4284 状压dp+spfa
题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
- BZOJ 1226 学校食堂(状压DP)
状压DP f(i,j,k)表示前i−1个人已经吃了饭,且在i之后的状态为j的人也吃了饭(用二进制表示后面的状态),最后吃的那个人是i之后的第k个 (注意k可以是负数) 然后 如果j&1=1那么 ...
随机推荐
- Codeforces 703C(计算几何)
C. Chris and Road time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- codevs——2822 爱在心中
2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description “每个人都拥有一个梦,即使彼此不相 ...
- POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】
题意: 给了n种硬币的名称,给了m种硬币间的转换关系. 从任意兑换地点开始兑换,看是否能够通过兑换的方式增加金钱. 思路: 用SPFA不断对各个点进行松弛操作,寻找正权值的环.如果找到则输出Yes. ...
- Effective Java Profiling With Open Source Tools
https://www.infoq.com/articles/java-profiling-with-open-source
- 学习Centos 7的笔记
Step-1 yum install epel-release && yum clean all && yum update –y && yum -y ...
- win8系统 重装系统如何删除EFI分区
在PE下(一般重装系统就是在PE下),依次输入如下命令(注意虽然显示的是中文名"磁盘0",但是还是用英文disk 0) list disk select disk 0 clean
- Guice 学习(八)AOP (面向切面的编程)
Guice的AOP还是非常弱的.眼下只支持方法级别上的,另外灵活性也不是非常高. 看例如以下演示样例: Guice支持AOP的条件是: 类必须是public或者package (default) 类不 ...
- 微信小程序 常见问题 小结
1.微信小程序 尺寸单位 rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则 ...
- Scrum 时间估算
在新公司里,不懂软件工程的产品经理经常逼迫研发人员作出很不靠谱的时间估算.常见场景有下面这些: 需求未细化的情况下要求给出时间估算:比如,就一句话描述需要做一个什么样的功能,但是具体页面长什么样,交互 ...
- vue入门教程 (vueJS2.X)
vue入门教程vueJS2.X 写在前面 看完此教程可以达到:能看懂并能修改简单的vue项目. 看的过程中,请把所有例子都放到html文件中跑一遍. Vue.js 是什么 Vue.js(读音 /vju ...