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. create table repo_folder_operate_log_bak as select * from repo_folder_operate_log;

    create table repo_folder_operate_log_bak as select * from repo_folder_operate_log;

  2. yum和apt-get用法及区别

    https://www.cnblogs.com/garinzhang/p/diff_between_yum_apt-get_in_linux.html

  3. js判断操作系统与浏览器

    摘要: 对于前端开发我们最重要的工作就是兼容性,系统的兼容性,浏览器的兼容性等等.今天分享一个我在项目中封装的判断操作系统与浏览器的方法. 操作系统: var os = (function() { v ...

  4. GDAL------安装GDAL

    1.官网下载GDAL http://www.gisinternals.com/http://www.gisinternals.com/release.php 2.下载完后,点击安装,选择安装全部组件, ...

  5. 8 -- 深入使用Spring -- 4... Spring的AOP

    8.4 Spring的AOP AOP(Aspect Orient Programming),也就是面向切面编程,最为面向对象编程的一种补充. AOP和OOP互为补充,面向对象编程将程序分解成各个层次的 ...

  6. ios开发周期之--(向上,向下,四舍五入)取整

    ceil(x)返回不小于x的最小整数值(然后转换为double型). floor(x)返回不大于x的最大整数值. round(x)返回x的四舍五入整数值.

  7. windows 下获取当前进程的线程数量

    #include <TlHelp32.h> int get_thread_amount() { ; ]; PROCESSENTRY32 pe32; pe32.dwSize = sizeof ...

  8. Mysql主从热备

    mysql主从配置比较不错的文章,大家可以参考下~ https://www.cnblogs.com/kissdodog/p/5422195.html

  9. Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入

    Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...

  10. 【VirtualBox】设置NAT端口映射-SSH登录

    参考地址: http://www.cnblogs.com/sky20081816/p/3951889.html http://blog.csdn.net/jiangsyace/article/deta ...