hdu 3681 压缩dp+搜索
题意:一个机器人想越狱,他只能带一定电量的电池,'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+搜索的更多相关文章
- HDU 3681 Prison Break(状态压缩dp + BFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- hdu 4778 Gems Fight! 博弈+状态dp+搜索
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...
- hdu 4057 AC自己主动机+状态压缩dp
http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
随机推荐
- 在C++11中实现监听者模式
参考文章:https://coderwall.com/p/u4w9ra/implementing-signals-in-c-11 最近在完成C++大作业时,碰到了监听者模式的需求. 尽管C++下也可以 ...
- 【leetcode 简单】第十七题 x 的平方根
实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...
- 吐泡泡(2018年全国多校算法寒假训练营练习比赛(第二场)+栈模拟)+Plug-in(codeforces81A+栈模拟)
吐泡泡题目链接:https://www.nowcoder.com/acm/contest/74/A 题目: 思路: 这种题目当初卡了我很久,今天早训时遇到一个一样得题,一眼就想到用栈模拟,就又回来把这 ...
- 配置node,sass,淘宝镜像环境
由于最近由于刚到手一台新的thinkpad(哈哈,宝宝是个小穷B,木有小苹果),所以工作开发中所用到的环境就需要重新安装一下啦,这里的话,我就把我目前所用到的进行总结一下,其余的会在以后的开发过程中, ...
- 前端bootstrap框架禁用响应式的方法
在Bootstrap中极其重要的一个技术内容便是响应式布局了,一次编码针对不同设备终端的强大能力使得响应式技术愈发流行. 不过正所谓“萝卜青菜各有所爱”,如果你想要使用Bootstrap开发自己的项目 ...
- windows安装React Native开发运行环境
React Native是什么 React Native是facebook开源的一个用于开发app的框架.React Native的设计理念:既拥有Native (原生) 的用户体验.又保留React ...
- OC学习篇之---类的延展
来源:http://blog.csdn.net/jiangwei0910410003/article/details/41775603 前一篇文章我们介绍了类的类目概念和使用:http://blog. ...
- 修改系统时间为UTC时间
1 拷贝时区文件 cp /usr/share/zoneinfo/Etc/GMT /etc/localtime 2 修改/etc/profile 在最后添加 TZ="Etc/GMT" ...
- Elasticsearch分片&副本分配
集群索引中可能由多个分片构成,并且每个分片可以拥有多个副本,将一个单独的索引分为多个分片,可以处理不能在单一服务器上运行的 大型索引. 由于每个分片有多个副本,通过副本分配到多个服务器,可以提高查询的 ...
- EF – 1.模式
3种数据库 code first model first database first 创建EF http://www.cnblogs.com/tangge/p/3834578.html DbSet ...