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条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
随机推荐
- 生产环境手把手部署ERC20智能合约
工具 rimex http://remix.ethereum.org/ metamask https://metamask.io/ ERC20 代码 https://github.com/OpenZe ...
- JavaScript实现水平进度条拖拽效果
<html> <head> <meta charset="UTF-8"> <title>Document</title> ...
- Deep Learning基础--机器翻译BLEU与Perplexity详解
前言 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分.而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测 ...
- 谷歌PageRank算法
1. 从Google网页排序到PageRank算法 (1)谷歌网页怎么排序? 先对搜索关键词进行分词,如“技术社区”分词为“技术”和“社区”: 根据建立的倒排索引返回同时包含分词后结果的网页: 将返回 ...
- 如何读懂statspack报告
前言:这篇文章是我从网上找到的,但可惜不知道是哪位大侠写(译)的,因此这里无法注明了.仔细看了看,这篇文章对初学者应该很有帮助,写的比较详细,通俗易懂,因此整理一下,便于阅读:内容略有调整,不单做调整 ...
- geoserver-manager发布style失败
当参数给定没有错误时,最有可能的原因就是: sld文件格式应该以UTF-8无BOM格式编码(自己生成的sld文件多数情况下是以UTF-8格式编码).
- mysql 创建数据库的时候选择 utf8 bin 和 utf8 ci的区别
utf8 ci 不区分大小写: utf8 bin 区分大小写:
- [ python ] 字符串的操作及作业题
字符串的操作方法 capitalize() : 首字母大写 s1 = 'my heart will go on' print(s1.capitalize()) # 首字母大写 # 执行结果: # My ...
- /etc/issue 与 /etc/issue.net 文件,telnet登陆前的显示
在使用文本设备(关于文本设备的例子,见下面的说明)登录Linux系统之前,系统会显示一条被称作“issue”的消息: 若是通过本地文本设备(如本地终端,本地虚拟控制台等)登录,则该信息存放与/etc/ ...
- Codeforces 799B - T-shirt buying(STL)
题目链接:http://codeforces.com/problemset/problem/799/B 题目大意:有n件T恤,每件T体恤都分别有价格(每件衣服的价格不重复).前面的颜色.背部的颜色三种 ...