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 ...
随机推荐
- Mybatis 3 返回布尔值,需要注意的地方
在Mybatis中,有时候需要返回布尔值 ,来确定某个记录行是否存在. 例如: <select id="isExistCode" parameterType="st ...
- 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...
- C++ 指针—02 指针与引用的对照
★同样点: ●都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名. ★不同点: ●指针是一个实体,而引用仅是个别名: ●引用仅仅能在定义时被初始化一次,之后不可变: ...
- sql优化-提防错误关联
在写sql时,在多表关联时,有时候容易把关联关系写错.一般情况下,该问题比较容易发现,但如果sql较长时,光靠眼力就比较难发现了.今天写了一个脚本,碰到该问题了. 第一版本的脚本如下: select ...
- 破解.net程序 编译和反编译方法
原文地址:http://www.cnblogs.com/li-peng/archive/2013/01/31/2886727.html 有好多.net程序有加密狗或者有验证,如果exe或dll没有做过 ...
- Android 布局之LinearLayout 子控件weight权重的作用详析(转)
关于Android开发中的LinearLayout子控件权重android:layout_weigh参数的作用,网上关于其用法有两种截然相反说法: 说法一:值越大,重要性越高,所占用的空间越大: 说法 ...
- jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互、特效、小部件及主题
jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互.特效.小部件及主题.无论您是创建高度交互的 Web 应用程序还是仅仅向窗体控件添加一个日期选择器,jQuery ...
- C++:抽象基类和纯虚函数的理解
转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ...
- 读取数据表中第m条到第n条的数据,SQL语句怎么写?
原文:读取数据表中第m条到第n条的数据,SQL语句怎么写? 对于MySQL或者Oracle来说,如果实现从Table 表中取出第 m 条到第 n 条的记录操作,我们需要TOP函数(不是所有的数据库都支 ...
- 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。
原文:如何在WindowsPhone Bing Map控件中显示必应中国中文地图.谷歌中国中文地图. 最近正好有点业余时间,所以在做做各种地图.Bing Map控件本身就能显示必应地图,但是很遗憾微软 ...