FZU 2092 收集水晶(记忆化搜索)
Problem 2092 收集水晶
Accept: 101 Submit: 439
Time Limit: 5000 mSec Memory Limit : 32768 KB
Problem Description
shadow来到一片神奇的土地,这片土地上不时会出现一些有价值的水晶,shadow想要收集一些水晶带回去,但是这项任务太繁杂了,于是shadow让自己的影子脱离自己并成为一个助手来帮助自己收集这些水晶。
shadow把这片土地划分成n*m个小方格,某些格子会存在一些shadow和他的影子都无法穿越的障碍,比如巨石、树木、野兽等。shadow预先探测到了水晶出现的时间、位置以及它们的价值,但这些水晶的存在就如昙花一现般短暂,若在出现后1秒内没有收集到,它便将消失。
在第0秒的时候,shadow和他的影子都处在第一行第一列的格子上,shadow和他的影子可以相互独立的移动,互不干扰。每一秒shadow能移动到相邻的一格,也可以呆在原地不动,shadow的影子也是。那么,shadow和他的影子能收集到的水晶价值总和最大是多少呢?
Input
输入数据第一行包含一个整数T,表示测试数据的组数。对于每组测试数据:
第一行两个整数n、m( 2 <= n , m <= 10 ),表示土地被划分为n行,每行m列个小方格。
接下来n行,每行m个字符,’.’或者’#’, 描述土地信息,’.’表示空地,’#’表示障碍。
接下来一行包含一个整数p( p < 0 < 1000 ),表示总共会出现的水晶数量。
接下来p行,每行4个整数,t( 0 < t <= 200 ),x( 1 <= x <= n ),y( 1 <= y <= m ),v( 0 < v <= 1000 ),表示第t秒会有一个价值v的水晶出现在第x行第y列的格子里。
Output
对于每组测试数组,输出一行包含一个整数,表示shadow和他的影子能收集到的最大价值总和。
Sample Input
1
3 3
…
..#
…
3
2 3 1 3
2 2 2 2
2 1 3 1
Sample Output
5
记忆化搜索,
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
char a[15][15];
int b[201][11][11];
int dp[201][11][11][11][11];
int t;
int n,m;
int cas;
int x,y,z,p;
int maxt=0;
int dir[5][2]={{0,1},{0,-1},{1,0},{-1,0},{0,0}};
int DFS(int x1,int y1,int x2,int y2, int t)
{
if(x1<1||x1>n||y1<1||y1>m||x2<1||x2>n||y2<1||y2>m)
return 0;
if(a[x1][y1]=='#'||a[x2][y2]=='#')
return 0;
if(t>maxt)
return 0;
if(dp[t][x1][y1][x2][y2]!=-1)
return dp[t][x1][y1][x2][y2];
int num=0;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
int xx1=x1+dir[i][0];
int yy1=y1+dir[i][1];
int xx2=x2+dir[j][0];
int yy2=y2+dir[j][1];
num=max(num,DFS(xx1,yy1,xx2,yy2,t+1));
}
}
if(x1==x2&&y1==y2)
dp[t][x1][y1][x2][y2]=num+b[t][x1][y1];
else
dp[t][x1][y1][x2][y2]=num+b[t][x1][y1]+b[t][x2][y2];
return dp[t][x1][y1][x2][y2];
}
int main()
{
scanf("%d",&cas);
while(cas--)
{
memset(b,0,sizeof(b));
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%s",a[i]+1);
scanf("%d",&p);
for(int i=1;i<=p;i++)
{
scanf("%d%d%d%d",&t,&x,&y,&z);
maxt=max(maxt,t);
b[t][x][y]+=z;
}
memset(dp,-1,sizeof(dp));
DFS(1,1,1,1,0);
printf("%d\n",dp[0][1][1][1][1]);
}
return 0;
}
FZU 2092 收集水晶(记忆化搜索)的更多相关文章
- FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力
题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...
- FZU 2092 收集水晶 dp+bfs
定义dp[t][x1][y1][x2][y2]为在t时刻,人走到x1,y1,影子走到x2,y2所获得最大价值 最终就是所有的dp[max][..][..][..][..]的最大值 然后递推也很自然,枚 ...
- FZU 2092 收集水晶
暴力DP. dp[x1][y1][x2][y2][t]表示,第一个人在(X1,Y1),第二个人在(X2,Y2),时间为t的时候获得的最大价值. 时间复杂度o(t*n*m*n*m*5*5). 什么都不优 ...
- FZU 2092 bfs+记忆化搜索
晚上团队训练赛的题 和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作 当时使用node记录人和影子的位置 然后进行两重for循环来分 ...
- FZU 1919 -- K-way Merging sort(记忆化搜索)
题目链接 Problem Description As we all known, merge sort is an O(nlogn) comparison-based sorting algorit ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- (记忆化搜索)Jury Compromise (poj 1015)
http://acm.fzu.edu.cn/problem.php?pid=1005 Description The fastfood chain McBurger owns several rest ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
随机推荐
- linux中高亮显示文本的工具 -- bat
bat 的项目地址 https://github.com/sharkdp/bat bat 是用rust 开发的, 在centos中安装bat需要rust的环境, 我们可以通过安装rust的包管理工具c ...
- IOS 基于APNS消息推送原理与实现(JAVA后台)--转
Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple ...
- 排列2(全排列next_permutation 注意格式)
排列2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- scala akka Future 顺序执行 sequential execution
对于 A => B => C 这种 future 之间的操作,akka 默认会自动的按照顺序执行,但对于数据库操作来说,我们希望几个操作顺序执行,就需要使用语法来声明 有两种声明 futu ...
- ios开发之--tableview单选/多选实现(非tableview的editing状态)及默认选中
实现思路比较简单,这里仅做记录: 直接上代码: 1,实现didSelectRowAtIndexPath方法 -(void)tableView:(UITableView *)tableView didS ...
- ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法
在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在ios8中,设置setS ...
- Windows系统下运行某些程序时缺少“Msflxgrd.ocx”的解决方法
出现这样的错误就是系统缺少相应的库文件,我们安装即可. 下载Msflxgrd.ocx,这里提供一个下载网址:https://www.ocxme.com/files/msflxgrd_ocx 64位系统 ...
- Kafka Java API操作topic
Kafka官方提供了两个脚本来管理topic,包括topic的增删改查.其中kafka-topics.sh负责topic的创建与删除:kafka-configs.sh脚本负责topic的修改和查询,但 ...
- JavaScript表达式--掌握最全的表达式,一切尽在掌握中,让表达不再是难事
一.JavaScript表达式: 算术表达式: 字符串表达式: 关系(比较)表达式: 逻辑表达式 二.JavaScript运算符: ●什么是表达式--表达式是产生一个结果值的式子,常量,变量,运算符. ...
- 嵌入式系统C编程之堆栈回溯(二)
前言 本文作为<嵌入式系统C编程之堆栈回溯>的补充版.文中涉及的代码运行环境如下: 一 异常信号 信号就是软件中断,用于向正在运行的程序(进程)发送有关异步事件发生的信息.Linux应用 ...