定义dp[t][x1][y1][x2][y2]为在t时刻,人走到x1,y1,影子走到x2,y2所获得最大价值

最终就是所有的dp[max][..][..][..][..]的最大值

然后递推也很自然,枚举人和影子的动向,唯一注意的是当走到一点时,只获得一次价值,要除以2

然后对于每一层时间,其实有效的很少,所以用bfs取有效点更新,这样可以减少一些时间复杂度,最终跑出来1593ms

#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <queue>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
typedef long long LL;
const int N=1e2+;
const int INF=0x3f3f3f3f;
int dx[]= {,,,-,};
int dy[]= {,-,,,};
char s[][];
int mp[][][];
int dp[][][][][];
bool vis[][][][][];
int n,m,p,mx;
struct Node
{
int t,x,y,k1,k2;
Node() {}
Node(int a,int b,int c,int d,int e)
{
t=a,x=b,y=c,k1=d,k2=e;
}
};
queue<Node>q;
void bfs()
{
memset(dp,-,sizeof(dp));
memset(vis,,sizeof(vis));
while(!q.empty())q.pop();
dp[][][][][]=;
vis[][][][][]=;
Node a,tmp;
q.push(Node(,,,,));
while(!q.empty())
{
a=q.front();
q.pop();
if(a.t==mx)continue;
tmp.t=a.t+;
int o=dp[a.t][a.x][a.y][a.k1][a.k2];
for(int i=; i<; ++i)
for(int j=; j<; ++j)
{
tmp.x=a.x+dx[i],tmp.y=a.y+dy[i];
tmp.k1=a.k1+dx[j],tmp.k2=a.k2+dy[j];
if(tmp.x<||tmp.x>n||tmp.y<||tmp.y>m)continue;
if(tmp.k1<||tmp.k1>n||tmp.k2<||tmp.k2>m)continue;
if(s[tmp.x][tmp.y]=='#'||s[tmp.k1][tmp.k2]=='#')continue;
int c=mp[tmp.t][tmp.x][tmp.y]+mp[tmp.t][tmp.k1][tmp.k2];
if(tmp.x==tmp.k1&&tmp.y==tmp.k2)c/=;
c+=o;
if(c>dp[tmp.t][tmp.x][tmp.y][tmp.k1][tmp.k2])
{
dp[tmp.t][tmp.x][tmp.y][tmp.k1][tmp.k2]=c;
if(!vis[tmp.t][tmp.x][tmp.y][tmp.k1][tmp.k2])
{
q.push(tmp);
vis[tmp.t][tmp.x][tmp.y][tmp.k1][tmp.k2]=;
}
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
mx=;
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i)
scanf("%s",s[i]+);
memset(mp,,sizeof(mp));
scanf("%d",&p);
for(int i=; i<p; ++i)
{
int t,x,y,v;
scanf("%d%d%d%d",&t,&x,&y,&v);
mx=max(mx,t);
mp[t][x][y]+=v;
}
bfs();
int ans=;
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j)
for(int k1=; k1<=n; ++k1)
for(int k2=; k2<=m; ++k2)
ans=max(ans,dp[mx][i][j][k1][k2]);
printf("%d\n",ans);
}
return ;
}

FZU 2092 收集水晶 dp+bfs的更多相关文章

  1. FZU 2092 收集水晶(记忆化搜索)

    Problem 2092 收集水晶 Accept: 101 Submit: 439 Time Limit: 5000 mSec Memory Limit : 32768 KB Problem Desc ...

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

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

  3. FZU 2092 收集水晶

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

  4. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  5. 洛谷P3724 大佬 [AH2017/HNOI2017] dp+bfs

    正解:dp+bfs 解题报告: 传送门! 这题看起来很复杂的样子其实真的很复杂 但是仔细看一下题目,会发现其实操作只有两个目的嘛,一个是保证自己不死,一个是让对手减血 而且保证自己不死只有一种操作 而 ...

  6. BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS

    BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...

  7. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  8. FZU - 2204 简单环形dp

    FZU - 2204 简单环形dp 题目链接 n个有标号的球围成一个圈.每个球有两种颜色可以选择黑或白染色.问有多少种方案使得没有出现连续白球7个或连续黑球7个. 输入 第一行有多组数据.第一行T表示 ...

  9. FZU 2092 bfs+记忆化搜索

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

随机推荐

  1. 重新安装Ubuntu12.04

    重新安装Ubuntu12.04 之所以我重新安装Ubuntu,因为我第一次给根目录分配的空间过小,好像是20GB吧~结果编译Android的时候,编译了3个小时候直接中止掉了.郁闷.这个也告诉我们一定 ...

  2. linux操作系统使用3G网卡

    几个月前,opensuse13.2出了,一直手痒痒,一有空装了一个.当时在学校,一直用着校园网,也好久没有使用3G网卡.回家的时候,办了个3G网卡,结果插电脑上没有反应,以前插上去,都会提示创建一个网 ...

  3. OS X平台上MySQL环境搭建

    参考资料: http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html http://blog.csdn.net/just ...

  4. hybird app

    Hybrid App 是混合模式应用的简称,兼具 Native App 和 Web App 两种模式应用的优势,开发成本低,拥有 Web 技术跨平台特性.目前大家所知道的基于中间件的移动开发框架都是采 ...

  5. AVFoundation 初识

    AVFoundation是苹果 OS X系统和 iOS系统中用于处理基于时间的媒体数据的高级Objective-C框架. iOS中 AVFoundation 在整个体系中所处的角色

  6. 一个空格也可以让html格式显示大不相同

    今天在编写html时出现了bug,有两个标签一直贴近显示,但是两段代码完全一样前一段就没有问题. 错误代码如下 <div id="tool1" style="wid ...

  7. Linux oracle数据库自动备份自动压缩脚本代码

    Linux oracle数据库备份完成后可以自动压缩脚本代码. 复制代码代码如下: #!/bin/bash #backup.sh #edit: www.jbxue.com ##系统名称 sysname ...

  8. MSSql ID自动增长删除数据重1开始

    dbcc checkident('db_Tome1.dbo.员工信息表',reseed,0) 注:dbcc checkident('表名',reseed,0)

  9. 在C#中关于excel的导入和导出操作

    一.先来看看最常见的导入操作吧! private void Import() { //打开excel选择框 OpenFileDialog frm = new OpenFileDialog(); frm ...

  10. map(function, sequence)

    map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回: >>> lt = range( ...