HDU 3681 BFS&像缩进DP&二分法
N*M矩阵。从F出发点。走完全部Y点。每个人格开支1电源点,去G点,电池充满,D无法访问。最小的开始问什么时候满负荷可以去完全部Y。Y和G总共高达15一
第一BFS所有的F。Y。G之间的最短距离。
然后一半的首发大。对于每次充电。不喜欢缩进DP推断是否可行
#include "stdio.h"
#include "string.h"
#include "queue"
using namespace std; int inf=0x3f3f3f3f;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
int x,y,step;
};
struct Mark
{
int x,y;
}mark[21]; char map[21][21];
int step[21][21],b[21],dp[70010][21],dis[21][21];
int cnt,aim,start,n,m; int Min(int a,int b)
{
if (a<b) return a;else return b;
}
void bfs(int x,int y)
{
queue<node>q;
node cur,next;
int i; memset(step,inf,sizeof(step));
step[x][y]=0;
cur.x=x;
cur.y=y;
cur.step=0;
q.push(cur);
while (!q.empty())
{
cur=q.front();
q.pop();
for (i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if (next.x<0 || next.x>=n || next.y<0 || next.y>=m) continue;
if (map[next.x][next.y]=='D') continue;
if (step[next.x][next.y]!=inf) continue; next.step=cur.step+1;
step[next.x][next.y]=next.step;
q.push(next);
}
}
} int DP(int key)
{
int i,j,k;
memset(dp,inf,sizeof(dp)); dp[b[start]][start]=0; for (i=0;i<b[cnt];i++)
for (j=0;j<cnt;j++)
if ((b[j]&i)==b[j] && dp[i][j]!=inf)
{
for (k=0;k<cnt;k++)
if (k!=j && (b[k]&i)!=b[k] && dp[i][j]+dis[j][k]<=key)
{
dp[i+b[k]][k]=Min(dp[i+b[k]][k],dp[i][j]+dis[j][k]);
if (map[mark[k].x][mark[k].y]=='G') dp[i+b[k]][k]=0;
if (((i+b[k])&aim)==aim) return 1;
}
}
return 0; }
int main()
{
int i,j,l,r,mid,ans;
b[0]=1;
for (i=1;i<=16;i++)
b[i]=b[i-1]*2;
while (scanf("%d%d",&n,&m)!=EOF)
{
if (n==0 && m==0) break;
cnt=0;
getchar();
for (i=0;i<n;i++)
gets(map[i]); aim=0;
for (i=0;i<n;i++)
for (j=0;j<m;j++)
if (map[i][j]=='F' || map[i][j]=='Y' || map[i][j]=='G')
{
if (map[i][j]!='G') aim+=b[cnt];
if (map[i][j]=='F') start=cnt;
mark[cnt].x=i;
mark[cnt].y=j;
cnt++;
} memset(dis,inf,sizeof(dis));
for (i=0;i<cnt;i++) // BFS出,F,Y,G之间的最短距离
{
bfs(mark[i].x,mark[i].y);
for (j=0;j<cnt;j++)
dis[i][j]=step[mark[j].x][mark[j].y];
} l=0; r=n*m;
ans=-1;
while (l<=r) // 二分电量
{
mid=(l+r)/2; if (DP(mid)==1)
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%d\n",ans); }
return 0;
}
HDU 3681 BFS&像缩进DP&二分法的更多相关文章
- hdu 3681(bfs+二分+状压dp判断)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...
- HDU 1074 Doing Homework(像缩进DP)
Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of h ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...
- HDU 1231 最大连续子序列 --- 入门DP
HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...
- hdu 1044(bfs+状压)
非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- hdu 4778 Gems Fight! 博弈+状态dp+搜索
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- C#反射Assembly 具体说明
1.对C#反射机制的理解 2.概念理解后,必须找到方法去完毕,给出管理的主要语法 3.终于给出有用的样例,反射出来dll中的方法 反射是一个程序集发现及执行的过程,通过反射能够得到*.exe或*.dl ...
- 依据不同的操作系统读取配置文件/java读取属性文件代码
package cn.com.css.common.util; /** * @brief OSEnum.java 操作系统的枚举 * @attention * @author 涂作权 * @d ...
- 浅析点对点(End-to-End)的场景文字识别(图片文字)
一.背景 随着智能手机的广泛普及和移动互联网的迅速发展,通过手机等移动终端的摄像头获取.检索和分享资讯已经逐步成为一种生活方式.基于摄像头的 (Camera-based)的应用更加强调对拍摄场景的理解 ...
- expression:stream!=NULL
如果fopen()后返回的是NULL:就不能调用fclose()了: 用fopen()获得的文件句柄不是NULL,那么就需要用fclose()来关闭它.如果是NULL则不需要 null就表示你打开文件 ...
- 2014最新SSH框架面试题大收集
(1)Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transati ...
- Android中Menu的基本使用方法
一. 使用xml定义Menu 菜单资源文件必须放在res/menu文件夹中.菜单资源文件必须使用<menu>标签作为根节点.除了<menu>标签外,还有另外两个标签用于设置菜单 ...
- Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单
原文:Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单 长长的列表文字类型文件 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 214 ...
- Android支付接入(八):Amazon亚马逊支付
下面跟大家一起走一遍Amazon亚马逊的支付,亚马逊目前刚把业务拓展到大陆市场,但这并不代表Amazon支付不成熟,恰恰相反,Amazon的支付流程,支付结果获取及测试另人称赞,支付流程.测试流程简洁 ...
- 2014 Multi-University Training Contest 1 - J Rating
题目链接: pid=4870">http://acm.hdu.edu.cn/showproblem.php?pid=4870 题目大意: 题意:一个人注冊两个账号,初始rating都是 ...
- 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图
我们会继续上传新书<自己动手写处理器>(未公布).今天是第十条.我每星期试试4 从本章開始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍 ...