题意:一个机器人想越狱,他只能带一定电量的电池,'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. 在C++11中实现监听者模式

    参考文章:https://coderwall.com/p/u4w9ra/implementing-signals-in-c-11 最近在完成C++大作业时,碰到了监听者模式的需求. 尽管C++下也可以 ...

  2. 5、Linux操作系统介绍

    1操作系统的作用·是现代计算机系统中最基本和最重要的系统软件·是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩展·主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用·而其 ...

  3. struts入门

    1.概念

  4. netif_receive_skb->__netif_receive_skb_core

    在设备驱动收包之后,会通过netif_receive_skb将收取的包,按照注册的协议回调,传递到上层进行处理: /* 将skb传递到上层 */ static int __netif_receive_ ...

  5. 登陆记录utmp wtmp

    /var/log/wtmp文件的作用     /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息.   查看方法:   可以用last命令输出当中内容: debian ...

  6. 2.rabbitmq 工作队列

    1. 生产者 #coding:utf8 import pika import json import sys message = ''.join(sys.argv[1:]) or "hell ...

  7. Valid Parentheses——栈经典

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  8. NIO-4pipe

    import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import org.ju ...

  9. 环状序列(UVa1584)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  10. php将长字符串拆分为指定最大宽度的字符串数组

    /** * 将字符串拆分为指定最大宽度的字符串数组.单字节字符宽度为1,多字节字符通常宽度为2 * @param string $msg 要拆分的字符串 * @param int $width 结果数 ...