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 收集水晶(记忆化搜索)的更多相关文章

  1. FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力

    题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...

  2. FZU 2092 收集水晶 dp+bfs

    定义dp[t][x1][y1][x2][y2]为在t时刻,人走到x1,y1,影子走到x2,y2所获得最大价值 最终就是所有的dp[max][..][..][..][..]的最大值 然后递推也很自然,枚 ...

  3. FZU 2092 收集水晶

    暴力DP. dp[x1][y1][x2][y2][t]表示,第一个人在(X1,Y1),第二个人在(X2,Y2),时间为t的时候获得的最大价值. 时间复杂度o(t*n*m*n*m*5*5). 什么都不优 ...

  4. FZU 2092 bfs+记忆化搜索

    晚上团队训练赛的题 和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作 当时使用node记录人和影子的位置 然后进行两重for循环来分 ...

  5. FZU 1919 -- K-way Merging sort(记忆化搜索)

    题目链接 Problem Description As we all known, merge sort is an O(nlogn) comparison-based sorting algorit ...

  6. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  7. (记忆化搜索)Jury Compromise (poj 1015)

    http://acm.fzu.edu.cn/problem.php?pid=1005 Description The fastfood chain McBurger owns several rest ...

  8. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  9. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

随机推荐

  1. linux中高亮显示文本的工具 -- bat

    bat 的项目地址 https://github.com/sharkdp/bat bat 是用rust 开发的, 在centos中安装bat需要rust的环境, 我们可以通过安装rust的包管理工具c ...

  2. IOS 基于APNS消息推送原理与实现(JAVA后台)--转

    Push的原理: Push 的工作机制可以简单的概括为下图   图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple ...

  3. 排列2(全排列next_permutation 注意格式)

    排列2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. scala akka Future 顺序执行 sequential execution

    对于 A => B => C 这种 future 之间的操作,akka 默认会自动的按照顺序执行,但对于数据库操作来说,我们希望几个操作顺序执行,就需要使用语法来声明 有两种声明 futu ...

  5. ios开发之--tableview单选/多选实现(非tableview的editing状态)及默认选中

    实现思路比较简单,这里仅做记录: 直接上代码: 1,实现didSelectRowAtIndexPath方法 -(void)tableView:(UITableView *)tableView didS ...

  6. ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法

    在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉. 但是在ios8中,设置setS ...

  7. Windows系统下运行某些程序时缺少“Msflxgrd.ocx”的解决方法

    出现这样的错误就是系统缺少相应的库文件,我们安装即可. 下载Msflxgrd.ocx,这里提供一个下载网址:https://www.ocxme.com/files/msflxgrd_ocx 64位系统 ...

  8. Kafka Java API操作topic

    Kafka官方提供了两个脚本来管理topic,包括topic的增删改查.其中kafka-topics.sh负责topic的创建与删除:kafka-configs.sh脚本负责topic的修改和查询,但 ...

  9. JavaScript表达式--掌握最全的表达式,一切尽在掌握中,让表达不再是难事

    一.JavaScript表达式: 算术表达式: 字符串表达式: 关系(比较)表达式: 逻辑表达式 二.JavaScript运算符: ●什么是表达式--表达式是产生一个结果值的式子,常量,变量,运算符. ...

  10. 嵌入式系统C编程之堆栈回溯(二)

    前言 本文作为<嵌入式系统C编程之堆栈回溯>的补充版.文中涉及的代码运行环境如下: 一  异常信号 信号就是软件中断,用于向正在运行的程序(进程)发送有关异步事件发生的信息.Linux应用 ...