题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入口处,不得停下,不得同时救多个人,而且回去的时间一步要做两步走,即时间增加一倍。求在给定时间S内,能救到的人的最大价值总和。

解法:bfs一遍记录每个点离起点的最短距离,那么救这个人的花费就是3*dis,然后已经知道救这个人的价值,那么最后求一个01背包即可。

要注意一个人都救不到的地方,我开始将dis都初始化为1000000007,这样的话如果走不到的话,花费就变成3*dis爆int了。悲剧。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#define Mod 10000007
using namespace std;
#define N 50107 char mp[][][];
int dis[][][];
int dp[];
int T[],P[],L,H,W;
int dx[] = {,,,, , -};
int dy[] = {,,-,, , ,};
int dz[] = {,,,-, , ,};
struct node {
int l,h,w,sec;
node(int _x,int _y,int _z,int _sec):l(_x),h(_y),w(_z),sec(_sec){}
node(){}
}vol[],S; bool OK(int x,int y,int z) {
if(x >= && x < L && y >= && y < H && z >= && z < W)
return true;
return false;
} void bfs(node S) {
queue<node> q;
while(!q.empty()) q.pop();
int i,j,k;
for(i=;i<L;i++)
for(j=;j<H;j++)
for(k=;k<W;k++)
dis[i][j][k] = Mod;
int x = S.l, y = S.h, z = S.w;
dis[x][y][z] = ;
q.push(S);
while(!q.empty()) {
node now = q.front();
q.pop();
int l = now.l, h = now.h, w = now.w, sec = now.sec;
if(mp[l][h][w] == 'U') {
for(k=;k<;k++) {
int nx = l + dx[k];
int ny = h + dy[k];
int nz = w + dz[k];
if(!OK(nx,ny,nz)) continue;
if(mp[nx][ny][nz] != 'X') {
if(sec+ < dis[nx][ny][nz]) {
dis[nx][ny][nz] = sec+;
node tmp = node(nx,ny,nz,sec+);
q.push(tmp);
}
}
}
}
else if(mp[l][h][w] == 'D') {
for(k=;k<;k++) {
if(k == ) continue;
int nx = l + dx[k];
int ny = h + dy[k];
int nz = w + dz[k];
if(!OK(nx,ny,nz)) continue;
if(mp[nx][ny][nz] != 'X') {
if(sec+ < dis[nx][ny][nz]) {
dis[nx][ny][nz] = sec+;
node tmp = node(nx,ny,nz,sec+);
q.push(tmp);
}
}
}
}
else {
for(k=;k<;k++) {
int nx = l + dx[k];
int ny = h + dy[k];
int nz = w + dz[k];
if(!OK(nx,ny,nz)) continue;
if(mp[nx][ny][nz] != 'X') {
if(sec+ < dis[nx][ny][nz]) {
dis[nx][ny][nz] = sec+;
node tmp = node(nx,ny,nz,sec+);
q.push(tmp);
}
}
}
}
}
} int main()
{
int t,n,STime,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d%d",&L,&H,&W,&n,&STime);
for(i=;i<L;i++) {
for(j=;j<H;j++) {
scanf("%s",mp[i][j]);
for(k=;k<W;k++)
if(mp[i][j][k] == 'S')
S = node(i,j,k,);
}
}
for(i=;i<=n;i++)
{
scanf("%d%d%d%d",&vol[i].l,&vol[i].h,&vol[i].w,&P[i]);
vol[i].l--,vol[i].h--,vol[i].w--;
}
bfs(S);
for(i=;i<=n;i++)
T[i] = *dis[vol[i].l][vol[i].h][vol[i].w];
memset(dp,,sizeof(dp));
for(i=;i<=n;i++) {
for(j=STime;j>=;j--) {
if(j >= T[i])
dp[j] = max(dp[j],dp[j-T[i]]+P[i]);
}
}
int Maxi = ;
for(i=;i<=STime;i++)
Maxi = max(Maxi,dp[i]);
printf("%d\n",Maxi);
}
return ;
}

UVALive 5066 Fire Drill --BFS+DP的更多相关文章

  1. UVALive 5066 Fire Drill BFS+背包

    H - Fire Drill Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Sta ...

  2. ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

    这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...

  3. ZOJ 3596Digit Number(BFS+DP)

    一道比较不错的BFS+DP题目 题意很简单,就是问一个刚好包含m(m<=10)个不同数字的n的最小倍数. 很明显如果直接枚举每一位是什么这样的话显然复杂度是没有上限的,所以需要找到一个状态表示方 ...

  4. UVA 11624 - Fire! 图BFS

    看题传送门 昨天晚上UVA上不去今天晚上才上得去,这是在维护么? 然后去看了JAVA,感觉还不错昂~ 晚上上去UVA后经常连接失败作死啊. 第一次做图的题~ 基本是照着抄的T T 不过搞懂了图的BFS ...

  5. 【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)

    \(IDA^*\) 说实话,这道题我一开始没想出正解,于是写了一个\(IDA^*\)... 但神奇的是,这个\(IDA^*\)居然连字符串长度分别为\(2500,4000\)的数据都跑得飞快,不过数据 ...

  6. UVALive 4025 Color Squares(BFS)

    题目链接:UVALive 4025 Color Squares 按题意要求放带有颜色的块,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么 ...

  7. AOJ 0121: Seven Puzzle (BFS DP STL 逆向推理)(转载)

    转载自:  http://m.blog.csdn.net/blog/Enjoying_Science/42008801 题目链接:http://acm.hust.edu.cn/vjudge/probl ...

  8. HDU3247 Resource Archiver(AC自动机+BFS+DP)

    题目,求最短的包含所有n个DNA片段且不包含任何一个病毒片段的序列. 容易用所有DNA片段和病毒片段建一个AC自动机,构造fail时处理一下各个结点后缀是DNA或者病毒的情况,然后dp[S][u]表示 ...

  9. UVa 11624 Fire!(BFS)

    Fire! Time Limit: 5000MS   Memory Limit: 262144KB   64bit IO Format: %lld & %llu Description Joe ...

随机推荐

  1. 图标集锦:10套免费的社交媒体 & 社交网站图标

    社交网络是最近几年互联网领域最热门的关键词之一,如今社会网络化媒体也成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能. 社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还 ...

  2. JavaScript学习笔记3之 数组 & arguments(参数对象)& 数字和字符串转换 & innerText/innerHTML & 鼠标事件

    一.Array数组 1.数组初始化(Array属于对象类型) /*关于数组的初始化*/ //1.创建 Array 对象--方法1: var arr1=[]; arr1[0]='aa';//给数组元素赋 ...

  3. 如何更好的通过Inflate layout的方式来实现自定义view

    本篇文章讲的是如何用现有控件产生一个组合控件的方法,十分简单实用.现在开始! 一.需求 我们要实现一个有红点和文字的按钮控件,就像下面这样: 二.实现 我的思路是让一个button和一个textvie ...

  4. 源码详解openfire保存消息记录_修改服务端方式

    实现openfire消息记录通常有两种方式,修改服务端和添加消息记录插件. 今天,简单的说明一下修改服务端方式实现消息记录保存功能. 实现思路 修改前: 默认的,openfire只提供保存离线记录至o ...

  5. Learn RxJava

    Learn RxJava http://reactivex.io/documentation/operators.html https://github.com/ReactiveX/RxJava/wi ...

  6. ReflectUitls类的编写和对反射机制的解析

    ReflectUitls类的编写和对反射机制的解析 反射相关的类 反射相关的类,最基本的当然是Class类. 获取了Class对象之后,就可以接着生成对象实例.调用方法.查看字段等等. 字段(Fiel ...

  7. JavaScript学习08 Cookie对象

    JavaScript学习08 Cookie对象 JavaScript Cookie Cookie对象: Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cooki ...

  8. 操作系统开发系列—12.f.在内核中添加中断处理 ●

    因为CPU只有一个,同一时刻要么是客户进程在运行,要么是操作系统在运行,如果实现进程,需要一种控制权转换机制,这种机制便是中断. 要做的工作有两项:设置8259A和建立IDT. /*========= ...

  9. 深入.net(.net平台)

    S2A技能点: 1.学会“自己”进行大量复杂数据的管理(数据类型.集合.xml.文件) 2.学会“优化”代码编写--- 复用.可扩展.可替换(封装.继承.多态) 什么是“跨平台”---- 您的应用程序 ...

  10. 【代码笔记】iOS-首页3张图片变化

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...