题意:一个机器人想越狱,他只能带一定电量的电池,'S'表示道路可行,'G'表示充电器, 只可充电一次,但是可以经过很多次。'F'表示起点,'Y'表示要破坏的机关,也是只能破坏一次,但是可以经过无数次。'D'表示不能经过的地点。求他能 破坏所有机关,带的最小初始电量。

链接:点我

真是神烦无比啊啊,这题

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
const int MAXN=;
int n,m,tt;
int d[][]={,,,-,,,-,};
int dp[<<MAXN][MAXN];
char s[MAXN][MAXN];
int dist[MAXN][MAXN][MAXN][MAXN];
int cnt;
int start;
int fin=;
bool vis[MAXN][MAXN];
struct Node
{
int x,y;
}node[MAXN],st,ed;
void bfs(int x,int y) //x,y点到其他点的距离
{
cl(vis);
if(s[x][y]=='D')return;//这个点的不需要处理
queue<Node> q;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
dist[x][y][i][j]=-;
}
}
while(!q.empty()) q.pop();
Node now,next;
now.x=x,now.y=y;
dist[x][y][x][y]=;
q.push(now);
vis[x][y]=;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=;i<;i++)
{
next.x=now.x+d[i][];
next.y=now.y+d[i][];
if(!vis[next.x][next.y]&&next.x>=&&next.x<n&&next.y>=&&next.y<m&&s[next.x][next.y]!='D')
{
if(dist[x][y][next.x][next.y]!=-)continue;
dist[x][y][next.x][next.y]=dist[x][y][now.x][now.y]+;
q.push(next);
vis[next.x][next.y]=;
}
}
}
}
bool check(int v)
{
memset(dp,-,sizeof(dp));
dp[<<start][start]=v;
for(int i=;i<(<<cnt);i++)
for(int j=;j<cnt;j++)
{
if(i==j) continue;
if((i&(<<j))==) continue; //去过了
if(dp[i][j]==-)continue;
if((i&fin)==fin) return ;
for(int k=;k<cnt;k++)
{
if((i&(<<k))) continue;
int dis=dist[node[j].x][node[j].y][node[k].x][node[k].y];
if(dis==-||dp[i][j]<dis) continue;
dp[i|(<<k)][k]=max(dp[i|(<<k)][k],dp[i][j]-dis);
if(s[node[k].x][node[k].y]=='G')dp[i|(<<k)][k]=v;
}
}
return ;
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==) break;
for(i=;i<n;i++) scanf("%s",s[i]);
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
bfs(i,j);
}
}
cnt=;
fin=;
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
if(s[i][j]=='F')
{
start=cnt;
fin|=(<<cnt);
node[cnt].x=i;
node[cnt++].y=j;
}
else if(s[i][j]=='Y')
{
fin|=(<<cnt);
node[cnt].x=i;
node[cnt++].y=j;
}
else if(s[i][j]=='G')
{
node[cnt].x=i;
node[cnt++].y=j;
}
}
}
int l=;
int r=n*m;
int ans=-;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid))
{
ans=mid;
r=mid-;
}
else l=mid+;
}
printf("%d\n",ans);
}
}

hdu 3681 压缩dp+搜索的更多相关文章

  1. HDU 3681 Prison Break(状态压缩dp + BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...

  2. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  3. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  4. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  5. HDU 4511 (AC自动机+状态压缩DP)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...

  6. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  7. hdu 4057 AC自己主动机+状态压缩dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...

  8. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU 3001 Travelling(状态压缩DP+三进制)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...

随机推荐

  1. 牛客网习题剑指offer之数值的整数次方

    分析: 要考虑到exponent为0和负数的情况. 如果base是0并且exponent是负数的时候呢?那就发生除0的情况了. AC代码: public class Solution { public ...

  2. WebStorm 2016激活

    最近在网上找到一个激活webStorm 的好东西.博主说对jetbrains下的所有产品都是可以用这种方式激活的...如:PhpStorm,IntelliJ JDEA等. 但别的产品我没有试过.对于w ...

  3. Linux 脚本内容指定用户执行

    #!/bin/bash set -x ## 因为这些变量在下面要用,所以要写在最上面, ## 如果直接写在下面,则变量获取不到,并且下面的 $ 标识的都要用 引号引起来,否则这些参数接收不到 tarf ...

  4. 64_t5

    texlive-mkpattern-svn15878.1.2-33.fc26.2.noarch..> 24-May-2017 15:54 38178 texlive-mkpic-bin-svn3 ...

  5. http状态码说明

    在学习网页设计的时候都应该知道状态码,但我们常见的状态码都是200,404,下面介绍其他的状态值 1开头的http状态码表示临时响应并需要请求者继续执行操作的状态代码. 100   (继续) 请求者应 ...

  6. Linux硬链接和软连接的区别与总结

    图示软硬链接的区别 有关硬链接的总结 具有相同inode节点号的多个文件互为硬链接文件: 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除: 只有删除了源文件和所有对应的硬链接文件,文件实体才 ...

  7. linux下rz,sz安装

    1.sz rz yum安装 yum install lrzsz

  8. strcpy、memcpy和memset之间的区别

    今天刷题时遇到了这个问题,记录一下. strcpy比较简单,就是拷贝字符串,遇到'\0'时结束拷贝. memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100] ...

  9. 20165301 2017-2018-2 《Java程序设计》第三周学习总结

    20165301 2017-2018-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章:类与对象 类: 类的声明:class+类名 类体:成员变量的声明+方法(局部变量+语 ...

  10. fail2ban安全设置

    1.先安装fail2ban服务包(这里我采用的是fail2ban-0.8.14.tar.gz) 2.解压安装包 cd /data/software tar xzf fail2ban-0.8.14.ta ...