题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681

思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题。首先bfs预处理出‘Y',’F','G'之间的最短距离,由于G点可以充电,到达G点就把当前能量更新为电池容量然后继续走。因为每个G点只能充一次电,这就好像TSP中的每个点只能走一次一样,然后就是二分答案了,用状压DP判定当前电池容量的情况下是否能符合条件。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; struct Node{
int x,y;
}node[*]; int dist[][][][];
int dp[<<][];
int n,m,state,final_state,start;
char map[][];
int dir[][]={{-,},{,},{,-},{,}}; void bfs(Node &node)
{
queue<pair<int,int> >que;
que.push(make_pair(node.x,node.y));
dist[node.x][node.y][node.x][node.y]=;
while(!que.empty()){
int x=que.front().first,y=que.front().second;
que.pop();
for(int i=;i<;i++){
int xx=x+dir[i][],yy=y+dir[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&map[xx][yy]!='D'){
if(dist[node.x][node.y][xx][yy]==-){
dist[node.x][node.y][xx][yy]=dist[node.x][node.y][x][y]+;
que.push(make_pair(xx,yy));
}
}
}
}
} bool Judge(int Power)
{
memset(dp,-,sizeof(dp));
dp[(<<start)][start]=Power;
int res=-;
for(int i=;i<(<<state);i++){
for(int j=;j<state;j++){
if((i&(<<j))==)continue;
if(dp[i][j]<)continue;
if(((i&final_state)&final_state)==final_state)res=max(res,dp[i][j]);
for(int k=;k<state;k++){
if((i&(<<k))||(j==k))continue;
if(dist[node[j].x][node[j].y][node[k].x][node[k].y]<)continue;
if(dp[i][j]-dist[node[j].x][node[j].y][node[k].x][node[k].y]<)continue;
dp[i|(<<k)][k]=max(dp[i|(<<k)][k],dp[i][j]-dist[node[j].x][node[j].y][node[k].x][node[k].y]);
if(map[node[k].x][node[k].y]=='G')dp[i|(<<k)][k]=Power;
}
}
}
return res>=;
} int main()
{
int low,high,mid,ans;
while(~scanf("%d%d",&n,&m)){
if(n==&&m==)break;
state=;
final_state=;
for(int i=;i<n;i++){
scanf("%s",map[i]);
for(int j=;j<m;j++){
if(map[i][j]=='F'){
start=state;
node[state].x=i,node[state].y=j;
final_state|=(<<state);
state++;
}else if(map[i][j]=='G'){
node[state].x=i,node[state++].y=j;
}else if(map[i][j]=='Y'){
node[state].x=i,node[state].y=j;
final_state|=(<<state);
state++;
}
}
}
memset(dist,-,sizeof(dist));
for(int i=;i<state;i++){
bfs(node[i]);
}
low=,high=,ans=-;
while(low<=high){
mid=(low+high)>>;
if(Judge(mid)){
ans=mid;
high=mid-;
}else
low=mid+;
}
printf("%d\n",ans);
}
return ;
}

hdu 3681(bfs+二分+状压dp判断)的更多相关文章

  1. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  2. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  3. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  4. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  5. HDU 4272 LianLianKan(状压DP)题解

    题意:一个栈,每次可以选择和栈顶一样的数字,并且和栈顶距离小于6,然后同时消去他们,问能不能把所有的数消去 思路:一个数字最远能消去和他相距9的数,因为中间4个可以被他上面的消去.因为还要判断栈顶有没 ...

  6. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

  7. HDU 3362 Fix (状压DP)

    题意:题目给出n(n <= 18)个点的二维坐标,并说明某些点是被固定了的,其余则没固定,要求添加一些边,使得还没被固定的点变成固定的, 要求总长度最短. 析:由于这个 n 最大才是18,比较小 ...

  8. HDU 3001 Travelling (状压DP,3进制)

    题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...

  9. HDU 2923 Relocation(状压dp+01背包)

    题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...

随机推荐

  1. Vim快捷键整理

    Vim主要分为两种模式一种是Insert模式,该模式下可以像其它文本编辑器一样正常输入字符:另一种是Normal模式,该模式下Vim监听用户的按键可以对文本进行快速修改. 想要从Insert模式切换到 ...

  2. nodejs入门篇---创建project并具体解释

    想了非常久.总想写点对大家有优点的,今天解说生成项目. 如今市面上一般须要人全栈-----mean(mongo,express.angular,nodejs),这样能够从前端开发到后端以及数据库,听起 ...

  3. js设置百分比保留两位小数

      CreateTime--2017年8月23日11:03:31Author:Marydon js设置百分比保留两位小数 错误用法: var percent = (num1/num2) * 100%; ...

  4. 用MyEclipse10.0远程连接Mysql数据库服务器

    说明:本文档所有的操作均在满足以下条件的情况下操作, A.远程Linux服务器已经安装好MySQL数据库 B.本地电脑可以ping通远程服务器 C.已经成功安装了Myeclipse 一.下载mysql ...

  5. iOS AVPlayer视频播放器

    代码地址如下:http://www.demodashi.com/demo/11168.html 一.运行效果 二.实现过程 ①.创建播放器avPlayer //创建播放器 url = [url str ...

  6. JavaScript点击按钮显示 确认对话框

    //JavaScript点击按钮显示确认对话框 <html xmlns="http://www.w3.org/1999/xhtml"> <head> < ...

  7. JVM虚拟机(一):java虚拟机的基本结构

    1: 类加载子系统(负责从文件系统或者网络中加载class信息,加载的类信息存放于一块成为方法区的内存空间.除了类信息外,方法区中可能还存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息 ...

  8. zookeeper(二):linux centos下安装zookeeper(单机和集群)

    下载 http://zookeeper.apache.org/releases.html 解压 tar –zxvf zookeeper-3.4.6.tar.gz 解压文件到"/usr/loc ...

  9. tomcat中的Manager App帐号password管理

    tomcat根文件夹下的conf文件夹下有个tomcat-users.xml文件 填写内容例如以下 <? xml version='1.0' encoding='utf-8'? >< ...

  10. 基于AXI VDMA的图像采集系统

    基于AXI VDMA的图像采集系统 转载 2017年04月18日 17:26:43 标签: framebuffer / AXIS / AXI VDMA 2494 本课程将对Xilinx提供的一款IP核 ...