【ZOJ2278】Fight for Food(dp)
BUPT2017 wintertraining(16) #4 F
ZOJ - 2278
题意
给定一个10*10以内的地图,和p(P<=30000)只老鼠,给定其出现位置和时间T(T<=1,000,000,000),求最多抓到几只老鼠。
题解
DP,f[i]表示按时间排序后抓第i个老鼠,最多能抓多少只。
bfs计算每对位置之间的距离\(dis[x1][y1][x2][y2]\)。
\(f[i]=max(f[i],f[j]+1)\)当i,j两只老鼠的距离小于他们的时间差。
j只用往前枚举50就够了,因为总共就10*10的地图。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 30005
#define inf 0x3f3f3f3f
using namespace std;
struct node{int x,y,t;}a[N];
int n,m,p;
int f[N],ans;//经过第i个最多经过几个
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int mm[20][20];
int dis[20][20][20][20];
bool cmp(const node& a,const node& b){
return a.t<b.t;
}
void bfs(int x,int y){
dis[x][y][x][y]=0;
queue<node>q;
q.push((node){x,y});
while(!q.empty()){
node k=q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=k.x+dx[i],ny=k.y+dy[i];
if(nx>=0&&ny>=0&&nx<n&&ny<m&&mm[nx][ny]
&&dis[x][y][nx][ny]==inf){
dis[x][y][nx][ny]=dis[x][y][k.x][k.y]+1;
q.push((node){nx,ny});
}
}
}
}
int main() {
while(~scanf("%d%d",&n,&m)){
memset(f,-inf,sizeof f);
memset(dis,inf,sizeof dis);
f[0]=ans=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
char c;
scanf(" %c",&c);mm[i][j]=(c!='#');
if(c=='L')a[0]=(node){i,j,0};
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)if(mm[i][j])bfs(i,j);
scanf("%d",&p);
for(int i=1;i<=p;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);
a[i].x--;a[i].y--;
}
sort(a+1,a+1+p,cmp);
for(int i=1;i<=p;i++){
for(int j=max(i-50,0);j<i;j++){
if(f[j]!=-inf&&dis[a[j].x][a[j].y][a[i].x][a[i].y]<=a[i].t-a[j].t)
f[i]=max(f[i],f[j]+1);
}
ans=max(f[i],ans);
}
printf("%d\n",ans);
}
return 0;
}
【ZOJ2278】Fight for Food(dp)的更多相关文章
- 【BZOJ】1068: [SCOI2007]压缩(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...
- 【51nod1519】拆方块[Codeforces](dp)
题目传送门:1519 拆方块 首先,我们可以发现,如果第i堆方块被消除,只有三种情况: 1.第i-1堆方块全部被消除: 2.第i+1堆方块全部被消除:(因为两侧的方块能够保护这一堆方块在两侧不暴露) ...
- 【bzoj1925】地精部落[SDOI2010](dp)
题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...
- 【POJ】3616 Milking Time(dp)
Milking Time Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10898 Accepted: 4591 Des ...
- 【POJ】2385 Apple Catching(dp)
Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13447 Accepted: 6549 D ...
- 【vijos】1764 Dual Matrices(dp)
https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角), ...
- 【Luogu】P3856公共子串(DP)
题目链接 DP.设last[i][j]是第i个串字符'j'所在的最后的位置,f[i][j][k]是第一个串匹配到i,第二个串匹配到j,第三个串匹配到k,最多的公共子串数. 那么我们三重循环i.j.k, ...
- 【Luogu】P3847调整队形(DP)
题目链接 DP果真是考思维啊 增加一个数的操作等价于删掉那个不和谐的数的操作. 所以1.2操作可以忽略. 剩下3.4操作,则可以设计f[i][j]是将区间[i,j]变成回文序列需要的操作数. if(a ...
- 【Luogu】P1586四方定理(DP)
题目链接 此题使用DP.设f[i][j]表示数i用j个数表示,则对于所有的k<=sqrt(i),有 f[i][j]=∑f[i-k*k][j-1] 但是这样会有重复情况.所以先枚举k,再枚举i和j ...
随机推荐
- RocketMQ环境搭建
1 源码下载 wget http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip unzip ...
- Luogu4099 HEOI2013 SAO 组合、树形DP
传送门 值得注意的是一般的DAG的拓扑序列数量是NP问题,所以不能直接入手 题目中给出的图可以看做是一个树形图,虽然方向比较迷.考虑使用树形图的性质 不妨任选一个点为根做树形DP,注意到数的位置与方案 ...
- React-本地状态(state)
在类组件中添加本地状态(state): 1.创建一个继承自 React.Component 类的 ES6 class 同名类: 2.添加一个 类构造函数(class constructor) 初始化 ...
- China Intelligent Office Summit(2018.11.21)
时间:2018.11.21地点:中关村软件园国际会议中心
- ajax获取的数据如何渲染到dom元素上
1.常见的字符串拼接 (对于动态创建的元素添加js时,使用事件委托,利用事件冒泡的原理,把事件添加到父级元素上,触发执行效果) $("ul").on('click','li',fu ...
- [Spark][python]以DataFrame方式打开Json文件的例子
[Spark][python]以DataFrame方式打开Json文件的例子: [training@localhost ~]$ cat people.json{"name":&qu ...
- 【php增删改查实例】第十七节 - 用户登录(1)
新建一个login文件,里面存放的就是用户登录的模块. <html> <head> <meta charset="utf-8"> <sty ...
- SQL调优日记--并行等待的原理和问题排查
概述 今天处理项目,客户反应数据库在某个时间段,反应特别慢.需要我们提供一些优化建议. 现象 由于是特定的时间段慢,排查起来就比较方便.直接查看这个时间段数据库的等待情况.查看等待类型发现了大量的CX ...
- 一文让你熟练掌握Linux的ncat(nc)命令
一文让你熟练掌握Linux的ncat(nc)命令 ncat 或者说 nc 是一款功能类似 cat 的工具,但是是用于网络的.它是一款拥有多种功能的 CLI 工具,可以用来在网络上读.写以及重定向数据. ...
- Ionic 入门与实战之第二章第二节:Ionic 环境搭建之 Ionic Lab 使用
原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第二节,主要对 Ionic Lab 工具作了介绍,并讲解了其使用方法,这也是一个开发 Ionic 比较好的调试工具. 原文发表于 ...