HDU3681 Prison Break(状压dp)

点餐系统数据库设计--SQL Server 友情链接 1、学生成绩管理系统数据库设计–MySQL 学生成绩管理系统数据库设计–MySQL 2、医疗信息管理系统数据库–MySQL 医疗信息管理系统数据库–MySQL 3、邮件管理数据库设计–MySQL 邮件管理数据库设计–MySQL 4、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) 5 阅读详情

Problem Description
Rompire is a robot kingdom and a lot of robots live there peacefully. But one day, the king of Rompire was captured by human beings. His thinking circuit was changed by human and thus became a tyrant. All those who are against him were put into jail, including our clever Micheal#1. Now it’s time to escape, but Micheal#1 needs an optimal plan and he contacts you, one of his human friends, for help.
The jail area is a rectangle contains n×m little grids, each grid might be one of the following:
1) Empty area, represented by a capital letter ‘S’.
2) The starting position of Micheal#1, represented by a capital letter ‘F’.
3) Energy pool, represented by a capital letter ‘G’. When entering an energy pool, Micheal#1 can use it to charge his battery ONLY ONCE. After the charging, Micheal#1’s battery will become FULL and the energy pool will become an empty area. Of course, passing an energy pool without using it is allowed.
4) Laser sensor, represented by a capital letter ‘D’. Since it is extremely sensitive, Micheal#1 cannot step into a grid with a laser sensor.
5) Power switch, represented by a capital letter ‘Y’. Once Micheal#1 steps into a grid with a Power switch, he will certainly turn it off.

In order to escape from the jail, Micheal#1 need to turn off all the power switches to stop the electric web on the roof—then he can just fly away. Moving to an adjacent grid (directly up, down, left or right) will cost 1 unit of energy and only moving operation costs energy. Of course, Micheal#1 cannot move when his battery contains no energy.

The larger the battery is, the more energy it can save. But larger battery means more weight and higher probability of being found by the weight sensor. So Micheal#1 needs to make his battery as small as possible, and still large enough to hold all energy he need. Assuming that the size of the battery equals to maximum units of energy that can be saved in the battery, and Micheal#1 is fully charged at the beginning, Please tell him the minimum size of the battery needed for his Prison break.
 

Input
Input contains multiple test cases, ended by 0 0. For each test case, the first line contains two integer numbers n and m showing the size of the jail. Next n lines consist of m capital letters each, which stands for the description of the jail.You can assume that 1<=n,m<=15, and the sum of energy pools and power switches is less than 15.
 

Output
For each test case, output one integer in a line, representing the minimum size of the battery Micheal#1 needs. If Micheal#1 can’t escape, output -1.
 

Sample Input
5 5 GDDSS SSSFS SYGYS SGSYS SSYSS 0 0
 

Sample Output
4
 


题目:机器人从F出发,走到G可以充电,走到Y关掉开关,D不能走进,要求把所有开关关掉,且电量最少,并求出该最小电量。


思路:因为我们必须要到的是 Y F, 可能到的是 G,我们把必须到的状态设置为  下面代码的all,所有的状态为len,然后根据当前状态可以更新哪些状态进行dp,这个题不清楚的地方是  G,题目说到了这个点可以充电,也可以不充电,可能下次来在充电,不过最好不要多想,到了G就充电吧







#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>


#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)

#define eps 1e-8
typedef __int64 ll;

#define fre(i,a,b)  for(i = a; i <b; i++)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define ssf(a)      scanf("%s",a)
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define bug         pf("Hi\n")

using namespace std;

#define INF 0x3f3f3f3f
#define N 20

char a[N][N];
int dis[N][N][N][N];

int k;
int n,m;
int first,all;

int dp[1<<16][16];    //dp[s][i] s状态下最后到达 i 点 还有的油

int step[4][2]={1,0,-1,0,0,1,0,-1};
int vis[N][N];

struct stud{

  stud(){};
  stud(int _x,int _y):x(_x),y(_y),time(0){}

  stud(int _x,int _y,int _time):x(_x),y(_y),time(_time){}

  int x,y;
  int time;

}f[N*N];


inline bool judge(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m) return true;
    return false;
}

void bfs(int t)
{
    queue<stud>q;
    int i,j;

    f[t].time=0;

    q.push(f[t]);

    stud cur;
    cur=f[t];

    dis[cur.x][cur.y][cur.x][cur.y]=0;

    mem(vis,0);



    vis[cur.x][cur.y]=1;


    while(!q.empty())
	{
	    cur=q.front();
	    q.pop();

	    fre(i,0,4)
	    {
	    	int xx=cur.x+step[i][0];
	    	int yy=cur.y+step[i][1];

	    	if(judge(xx,yy)&&a[xx][yy]!='D'&&!vis[xx][yy])
			{
				dis[f[t].x][f[t].y][xx][yy]=cur.time+1;   //起始点和这个点的距离

				vis[xx][yy]=1;

				q.push(stud(xx,yy,cur.time+1));
			}

	    }
	}
}

bool check(int now)
{

    int i,j;

	mem(dp,-1);
	dp[1<<first][first]=now;

	int cur,len=1<<k;

	int to,ans=-1;

	fre(cur,0,len)
	 fre(i,0,k)
	 {
         if((cur&(all))==all) ans=max(ans,dp[cur][i]);   //走过该走的点了

         if(ans!=-1) return true;

	 	 if(!(cur&(1<<i))) continue;    // cur 应该是走过 i 的

	 	 if(dp[cur][i]==-1) continue;   //这种状态没有走到过

	 	 fre(to,0,k)                     //枚举下一个点
	 	 {
	 	 	if(cur&(1<<to)) continue;

	 	 	if(dis[f[i].x][f[i].y][f[to].x][f[to].y]==-1) continue;   //两者无法到达

            if(i==to)  continue;

	 	 	int time=dp[cur][i]-dis[f[i].x][f[i].y][f[to].x][f[to].y];   //从 i 走到 to 后剩下的油

	 	 	if(time<0) continue;

	 	 	int next=cur+(1<<to);

	 	 	dp[next][to]=max(dp[next][to],time);

	 	 	if(a[f[to].x][f[to].y]=='G') dp[next][to]=now;  //如果现在到达的点 可以加油 
																		 
																			//(其实我感觉这里是有bug的,可能别人先到这个点不加油,下一次到的时候加油)

	 	 }
	 }
	 return false;
}

int solve()       //二分答案
{
	int le,ri,mid;
	int ans=300;
	le=0;
	ri=300;
    int i=0;

	while(le<=ri)
	{
		 mid=(le+ri)>>1;

		 if(check(mid))    //判断mid可否满足条件
		 {
		 	ans=mid;
		 	ri=mid-1;
		 }
         else
			le=mid+1;
	}

    if(ans==300)
		return -1;
	return ans;
}

int main()
{
	int i,j;

    //freopen("in.txt","r",stdin);

	while(~sff(n,m),n+m)
	{
		fre(i,0,n)
		  ssf(a[i]);

		all=0;
		k=0;

		fre(i,0,n)
		 fre(j,0,m)
		 {
		 	 if(a[i][j]=='F')
			  {
			    all|=1<<k;           //我们要走所有点的最终状态是 all
                first=k;
			  	f[k++]=stud(i,j);
			  }
			  else
				if(a[i][j]=='Y')
			  {
                 all|=1<<k;
			  	 f[k++]=stud(i,j);
			  }
			  else
				if(a[i][j]=='G')
			  	  f[k++]=stud(i,j);
		 }

        int t,tt;
		fre(i,0,20)
		  fre(j,0,20)
		    fre(t,0,20)
		     fre(tt,0,20)
		      dis[i][j][t][tt]=-1;

		fre(i,0,k)
		  bfs(i);    //求出任意两个点的距离


       int ans=solve();
       pf("%d\n",ans);
	}
	return 0;
}






vs2017配置liblas库+测试代码 之前已经配置好pcl(vs2017配置pcl),可以单独配置liblas,也可以在原有pcl属性表的基础上继续配置 阅读详情

相关推荐

Android Settings 设置Preference置灰显示

使Preference置灰显示,不能点击。先调用Preference的setEnabled(false),再调用setShouldDisableView(true); 如果使置灰项恢复正常可点击,可调用setEnabled(true)。

随风而动 1048

hdu 3681 Prison Break

Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one day, the king of Rompire was captured by

喵呜的Blog 1948

FFmpeg硬件加速实战:VAAPI驱动配置全攻略(含NVIDIA/Intel避坑指南)

本文详细解析了在Linux环境下配置FFmpeg使用VAAPI接口实现硬件加速的完整流程。针对NVIDIA、Intel等主流显卡,提供了从驱动安装、环境变量设置到多显卡切换的实战指南,并重点解决了闭源驱动冲突、国产系统适配等常见问题,帮助用户有效提升视频处理性能。

weixin_29306011的博客 453

BFS最短路+状态dp(hdu3681)好

Prison BreakProblem DescriptionRompire is a robot kingdom and a lot of robots live there peacefully. But one day, the king of Rompire was captured by human beings. His thinking circuit was changed by h

龙崎的专栏 656

低功耗模式下的看门狗使用

最近用国产芯片AT32在做一个低功耗的项目,为了实现低功耗模式下的定时唤醒,我选择的是使用相对比较简单的看门狗来做,下面就分享一下使用过程~ 为了最大限度的降低功耗,我用的是待机模式,先看看几种低功耗模式以及唤醒的区别: 而看门狗AT32提供了两种,分别是独立看门狗(IWDG)和窗口看门狗(WWDG),其区别大概有以下几点: 1、独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效;窗口看门狗由从 APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常

dc18883988396的博客 3028

【机器学习入门】1.4 吃透这些基本术语,才算真正入门

本文通过"挑西瓜"的生活案例,形象解释了机器学习的基本术语。样本对应单个西瓜,特征如色泽、根蒂等是观察维度,特征值是其具体表现,标签是西瓜的好坏判断。数据集是样本集合,特征向量是样本的数学表达,特征空间是所有可能的样本组合。文章强调数据集需划分为训练集、验证集和测试集,以评估模型的泛化能力。最后整理了术语对照表,并解答了常见问题。这些基础概念是理解机器学习的关键,建议读者重点掌握。

国科大硕士在读,分享Python/GEE/Matlab/R专业代码实践,涵盖数据分析、算法开发与应用技巧等,以代码会友。 653

hdu3681之状态压缩dp

Prison Break Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2845    Accepted Submission(s): 710 Problem Description Rompire is a r

Stephen 2046

基于灰度信息的图像配准方法

图像配准方法分为三种:基于灰度信息方法、基于变换域方法和基于特征方法。基于灰度信息方法是直接根据图像或图像块灰度信息进行像素上的对齐,该方法主要思想是直接最小化图像信息差异。然而,图像信息差异的判断准则衍生出不同的配准方法。常见的基于灰度信息的图像配准方法包括互相关法、互信息法和误差平方和法。本节将分别对互相关法、互信息法和误差平方和算法展开介绍,并通过MATLAB进行演示。基于灰度的图像方法容易实现,但同样存在不足。该方法对成像条件(光照,遮挡)、图像形变旋转以及噪声极其敏感,同时具有较高的计算复杂度。

weixin_42068054的博客 3775

HDU 3681 Prison Break 二分+搜索 The 35th ACM-ICPC Asia Regional Contest (Hangzhou)

Prison Break Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1076 Accepted Submissio

魔神翼 2028

15、远程操作水下航行器(ROV)的非线性控制系统设计

本文探讨了远程操作水下航行器(ROV)的非线性控制系统设计,重点介绍了多变量PID控制、改进的PD控制和滑模控制三种方法。详细阐述了各控制策略的原理、建模与仿真过程,并通过对比分析其在稳态误差、振荡、抖振及跟踪效果等方面的性能表现。文章还提出了针对不同控制方法的优化建议,并给出了选择合适控制策略的决策流程,为ROV高精度运动控制提供了系统性解决方案。

sun99的博客 156

解决【x2openEuler环境检查未通过——CheckRepoCurlActor不通过】问题

摘要:x2openEuler使用默认repo源时出现环境检查失败问题,原因是默认源返回308永久重定向错误。解决方法包括:1)为CentOS主机配置华为yum源;2)在x2openEuler Web界面修改为自定义可用源。具体步骤包括备份原源、下载华为源、清除缓存,并通过curl测试确认新源可用性。最终成功配置openEuler-24.03-LTS-SP1版本的repo源后,环境检查顺利通过。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 258

HDU 3681-Prison Break(状压DP+二分+BFS)

Prison Break Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5110    Accepted Submission(s): 1406 Problem Description Rompire is a robo

信仰.的博客 586

深度解析:LPDDR5 Receiver 的挑战与应对

LPDDR5 的数据速率已经来到Tbit​DataRate1​≈156ps在6400Mbps时也就是说,。👉 这就是为什么成为 LPDDR5 的“标配”。

weixin_43199439的博客 211

HDU 3681 Prison Break(状压DP + BFS)题解

题意:一张图,F是起点,Y是必须要到的点,D不能走,G可以充电。可以往四个方向走,每走一步花费一个电,走到G可以选择充满电或者不充,每个G只能充一次。问你走遍Y的最小初始点亮。number(G) + number(Y) <= 15 思路:显然Y和G都只要用一次就行,那么状压YG状态。然后BFS出任意YG两点最短路,状压DP。用&判断最终结果是不是当前状态的子集。 代码:...

weixin_30357231的博客 100

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【搜索+状压DP】 HDU 3681 Prison Break

点击打开链接 题意:开始能量包能提供走K步的能量,从F点出发要经过每一个Y点,通过G点时能充满能量包。且不能经过D点 求最小的K。 Y+G的个数最多有15个 因为只有15个有用的点预处理出两两的距离,二分K值 状压搞一搞 #include using namespace std; typedef long long LL; typedef pair PI; char s[12

Kewowlo 626

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hdu 3681 Prison Break(状压dp+二分)

题目链接 Prison Break Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4708    Accepted Submission(s): 1283 Problem Description Rom

fouzhe的博客 420

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HDU 3681 Prison Break (搜索+状压dp)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3681 题意: 一个机器人想越狱,他只能带一定电量的电池,'S'表示道路可行,'G'表示充电器,只可充电一次,但是可以经过很多次。'F'表示起点,'Y'表示要破坏的机关,也是只能破坏一次,但是可以经过无数次。'D'表示不能经过的地点。求他能破坏所有机关,带的最小初始电量。 题解: 一看

lamborghini1993 1738

HDU 3681 Prison Break - 状压dp【TSP】

题目描述题目大意:一个机器人想越狱,监狱是一个N*M的网格。每走一格,耗费1个单位的电量。他只能带一定电量的电池, ‘F’表示起点, ‘S’表示道路可行, ‘D’表示不能经过的地点。 ‘G’表示充电器,只可充电一次,但是可以经过很多次。‘Y’表示要破坏的机关,也是只能破坏一次,但是可以经过无数次。 求机器人破坏掉所有机关,需要带的最小初始电量。 分析:破坏所有的机关Y,且G,Y,F的总和不超过15

yuanxinyu402的博客 424

HDU 3681 Prison Break (状压DP+二分)

题意:给你一个n*m的图,机器人只能上下左右移动,移动一格消耗一点能量,F是起点,D是不可经过的点,S是空地,G是充能的站点,Y是必须经过的点,整个过程机器人必须让自己的能量尽可能的少,并且经过所有的Y,问机器人的最小能量容量是多少。 思路:因为‘G’和‘Y’的数量和T小于等于15,所以用这个来表示状态。 设'Y'的点数为Y。那么F标号为0,'Y'的点依次标号为1,2,....Y 。‘G’标号

Neutralzz的博客 357

HDU 3681 Prison Break(状压DP + 二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 题意:给一张N * M的图,只能上下左右移动,每移动一格消耗一点能量,其中F是起点,D不能走,G点可以把能量加满,Y点必须经过,问最少需要多大的能量容量可以将Y点全部遍历 思路:先将原图hash成易处理的图,再bfs预处理出每个F,G,Y到其他点的最短距离,然后二分答案进行状压D...

Tongqi 702

Hdu3681Prison Break状压Dp

#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <m...

weixin_30381793的博客 102

HDU 3681 Prison Break (二分答案+状压DP+bfs预处理)

题意: 机器人从F出发,走到G可以充满电,走到Y关掉开关,D不能走进,要求把所有开关关掉,且机器人存储的电量最少,并求出该最小电量。 分析: 把F,G,Y三种类型的点找出来,进行讨论,首先bfs处理出来各个点之间的最短路。现在题目就变成了:求一幅图中满足走遍所有Y点的条件,机器人存储的电量最少。 由于点最多只有15个,状压dp来处理。二分机器人的储电量,每次用dp来做判定条件。

Paradiser 986

hdu3681Prison Break 状压dp TSP 二分

点击打开链接 题意:机器人逃狱,需把所有开关Y遍历才能成功,G可以使机器人充满电(只能使用一次,也可暂时不用),D不能走,S为空,走一步要消耗一格电,没电无法继续走,问机器人能逃出去起始需要具有的最少电量。 思路:把G,Y抽离出来建立一张图,预处理任意两点的最短距离(bfs),G和Y都只通过一次(这里并不意味着走到G就必须用掉,很明显由于是最短路径,用掉是最优解,有些G可能包含在最短路径之中通

Every day 709

HDU-3681-Prison Break(BFS+状压DP+二分)

Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one day, the king of Rompire was captured by human beings. His thinking circuit was changed by human an

青春无悔 1584

HDU 3681 Prison Break 越狱(状压DP,变形)

题意:   给一个n*m的矩阵,每个格子中有一个大写字母,一个机器人从‘F’出发,拾取所有的开关‘Y’时便能够越狱,但是每走一格需要花费1点能量,部分格子为充电站‘G’,每个电站只能充1次电。而且部分格子为障碍'D'或者空格‘S’。机器人在开始时电池是满能量的,问电池容量至少为多少可以越狱?(1<=n,m<=14,充电站+开关的总个数<=15) ...

weixin_30878361的博客 150
上一篇: HDU 5186 zhx's submissions (进制转换)
下一篇: 2015广东工业大学ACM校赛 I 游戏王 (状压dp)
左眼皮跳跳~
博客等级 码龄13年 17粉丝 400原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值