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循环来分 ...
随机推荐
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- 如何在Linux下创建与解压zip, tar, tar.gz和tar.bz2文件
这么多年来,数据压缩对我们来说是非常有用的.无论是在邮件中发送的图片用的zip文件还是在服务器压缩数据文件,我们都可以让下载更容易或者有效的节约磁盘空间.某些压缩格式有时允许我们以60%的比率(甚至更 ...
- C#简单的tcpserver
实现一个简单的TCPserver,用tcplistener实现. 当收到客户端特定信息"101"时,发送给客户端"202“指令. using System; using ...
- Javascript代码摘录
判断浏览器窗口高度 if (document.documentElement.clientHeight <800) { var elm = document.getElementById('Di ...
- c#让窗体永在最前 调用windows api 将窗体设为topmost
有时候应用程序需要将一个窗体始终位于屏幕的最前面,即使切换到其它窗体也能看到该窗体,这样的窗体就叫做TopMost窗体. 用C#制作TopMost窗体之前,首先要了解如何声明SetWindowPos函 ...
- 【BZOJ】1070: [SCOI2007]修车
1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...
- Vue + Webpack + Vue-loader 1
Vue + Webpack + Vue-loader 原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue ...
- CAShapeLayer--备用
之前讲过CALayer动画相关知识,再来看看更加复杂的CAShapeLayer相关的动画知识. 普通CALayer在被初始化时是需要给一个frame值的,这个frame值一般都与给定view的boun ...
- css中table-layout:fixed 属性的用法
table-layout:fixed 属性的用法:如果想要一个table固定大小,里面的文字强制换行(尤其是在一长串英文文本,并且中间无空格分隔的情况下),以达到使过长的文字 不撑破表格的目的,一般是 ...
- MySQL注入中load_file()函数的应用
常用的一些Load_File()函数攻击手法: