题意:一个机器人想越狱,他只能带一定电量的电池,'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. SDUT 3917

    UMR 现在手里有 n 张康纳的表情,最上面一张是玛吉呀巴库乃.现在 UMR 如果每次把最上面的 m 张牌移到最下面而不改变他们的顺序及朝向,那么至少经过多少次移动玛吉呀巴库乃才会又出现在最上面呢? ...

  2. 【leetcode 简单】第十七题 x 的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  3. javascript复习笔记

    /* Javascript:用来在页面中编写特效,和HTML.CSS一样都是有浏览器解析 Javascript语言: 一.JS如何运行(javascript,jscript,vbscript,appl ...

  4. Tomcat参数调优包括日志、线程数、内存【转】

    [Tomcat中日志打印对性能测试的影响] 一般都提供了这样5个日志级别: ▪ Debug ▪ Info ▪ Warn ▪ Error ▪ Fatal 由于性能测试需要并发进行压力测试,如果日志级别是 ...

  5. pip安装使用详解【转】

    转自:pip安装使用详解 – 运维生存时间http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa/ pip类似RedHat里面的yum ...

  6. https、socket、http协议

    一.https https 其实是由两部分组成:http+ssl(Secure Sockets Layer 安全套接层)/tls(Transport Layer Security 继任者安全传输层), ...

  7. sshpass-免交互SSH登录工具

    sshpass用于自动向命令行提供密码,适用于ssh,scp,rsync,pssh,pscp等ssh系列的命令和工具 #安装sshpass yum install sshpass -y #注:当第一次 ...

  8. find tar排除指定文件或目录操作及查找文件内容关键字

    1.find查找排除单个目录 查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk find . -path "./sk" -prune -o -name "*. ...

  9. 在Hboxlayout中组件的显示比例

    有两种方法: 在插入布局的时候设置 mainLayout->addWidget(list,1,Qt::AlignCenter); mainLayout->addWidget(stack,3 ...

  10. Java学习笔记之:Java Servlet 过滤器配置

    一.步骤 1.创建一类实现Filter接口,重写父类的方法 public class SimpleFilter implements Filter { public void destroy() { ...