FZU 2092 收集水晶 dp+bfs
定义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的更多相关文章
- FZU 2092 收集水晶(记忆化搜索)
Problem 2092 收集水晶 Accept: 101 Submit: 439 Time Limit: 5000 mSec Memory Limit : 32768 KB Problem Desc ...
- FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力
题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...
- FZU 2092 收集水晶
暴力DP. dp[x1][y1][x2][y2][t]表示,第一个人在(X1,Y1),第二个人在(X2,Y2),时间为t的时候获得的最大价值. 时间复杂度o(t*n*m*n*m*5*5). 什么都不优 ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- 洛谷P3724 大佬 [AH2017/HNOI2017] dp+bfs
正解:dp+bfs 解题报告: 传送门! 这题看起来很复杂的样子其实真的很复杂 但是仔细看一下题目,会发现其实操作只有两个目的嘛,一个是保证自己不死,一个是让对手减血 而且保证自己不死只有一种操作 而 ...
- 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 ...
- BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs
BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...
- FZU - 2204 简单环形dp
FZU - 2204 简单环形dp 题目链接 n个有标号的球围成一个圈.每个球有两种颜色可以选择黑或白染色.问有多少种方案使得没有出现连续白球7个或连续黑球7个. 输入 第一行有多组数据.第一行T表示 ...
- FZU 2092 bfs+记忆化搜索
晚上团队训练赛的题 和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作 当时使用node记录人和影子的位置 然后进行两重for循环来分 ...
随机推荐
- Redhat 6.5 x64 下载地址
http://ftp.okhysing.is/ftp/redhat/6.5/isos/x86_64/
- 使用Github总结
1. 使用Git GUI 首先熟悉一下GUI,如下: 第一步,首先将代码fork到自己的版本库下面,如下: 并获取clone URL,如下图: 然后点击GUI克隆已有版本库,如下图: 点击克隆就可以得 ...
- Socket和SignalR
写到一半停电了,这心情真是哔了狗了,草稿箱竟然也没有!!! 好吧,这篇文档是之前写的记录,现在来完善(还是要完善的). 导读: 附件代码实现: Socket: 定义,同步实现,异步实现,还包括了TCP ...
- 利用Multipeer Connectivity框架进行WiFi传输-b
什么是Multipeer Connectivity? 在iOS7中,引入了一个全新的框架——Multipeer Connectivity(多点连接).利用Multipeer Connectivity框 ...
- 领域驱动设计和实践(转:http://kb.cnblogs.com/page/112298/)
引言 软件系统面向对象的设计思想可谓历史悠久,20世纪70年代的Smalltalk可以说是面向对象语言的经典,直到今天我们依然将这门语言视为面向对象语言的基础.随着编程语言和技术的发展,各种语言特性层 ...
- hdu 1828 Picture(线段树 || 普通hash标记)
http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others) Mem ...
- swift版本hello
import UIKit class ViewController: UIViewController { @IBOutlet var button : UIButton? //var alertVi ...
- 备忘·添加SublimeText3右键菜单
因为用的sublimeText3是免安装版,打开未关联文件,略有麻烦,所以搜了一下,发现几种解决办法,其中INF文件的方法很喜欢,备份下 [Version] Signature="$Wind ...
- about backbone
http://presentation.tiddr.de/backbone-presentation/introduction/index.html#Further%20issues http://m ...
- ubuntu下firefox安装Adobe Flash Player
转自ubuntu系统自带的火狐(firefox)如何安装Adobe Flash 当你刚装完系统,发现打开某些网站时,提示你"需要安装flash",然后你点击确定,过了一会,提示你安 ...