设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可

但是这样是O(n^4)的,考虑优化

发现同一行或列,取max对应a-1中的是单调挪动的一个区间,所以用单调栈维护当前区间,每次移动的时候要把左端点已经大于最长滑行距离的出队,然后把新点放进去,然后直接更新答案,这样就省去了一个n的时间

注意如果遇到障碍的话,当前的f赋值-inf,然后把队列清空

#include<iostream>
#include<cstdio>
using namespace std;
const int N=205,dx[]={0,-1,1,0,0},dy[]={0,0,0,-1,1},inf=1e9;
int n,m,k,sx,sy,s[N],t[N],d[N],f[N][N][N],q[N],l,r,ans;
char c[N][N];
int main()
{
scanf("%d%d%d%d%d",&n,&m,&sx,&sy,&k);
for(int i=1;i<=n;i++)
scanf("%s",c[i]+1);
for(int i=1;i<=k;i++)
scanf("%d%d%d",&s[i],&t[i],&d[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
f[0][i][j]=-inf;
f[0][sx][sy]=0;
for(int a=1;a<=k;a++)
{
if(d[a]==1)
{
for(int j=1;j<=m;j++)
{
l=1,r=0;
for(int i=n;i>=1;i--)
{
if(c[i][j]=='x')
{
l=1,r=0;
f[a][i][j]=-inf;
continue;
}
while(l<=r&&q[l]-i>t[a]-s[a]+1)
l++;
while(l<=r&&f[a-1][i][j]+i>f[a-1][q[r]][j]+q[r])
r--;
q[++r]=i;
f[a][i][j]=f[a-1][q[l]][j]+q[l]-i;
}
}
}
if(d[a]==2)
{
for(int j=1;j<=m;j++)
{
l=1,r=0;
for(int i=1;i<=n;i++)
{
if(c[i][j]=='x')
{
l=1,r=0;
f[a][i][j]=-inf;
continue;
}
while(l<=r&&i-q[l]>t[a]-s[a]+1)
l++;
while(l<=r&&f[a-1][i][j]-i>f[a-1][q[r]][j]-q[r])
r--;
q[++r]=i;
f[a][i][j]=f[a-1][q[l]][j]+i-q[l];
}
}
}
if(d[a]==3)
{
for(int i=1;i<=n;i++)
{
l=1,r=0;
for(int j=m;j>=1;j--)
{
if(c[i][j]=='x')
{
l=1,r=0;
f[a][i][j]=-inf;
continue;
}
while(l<=r&&q[l]-j>t[a]-s[a]+1)
l++;
while(l<=r&&f[a-1][i][j]+j>f[a-1][i][q[r]]+q[r])
r--;
q[++r]=j;//cerr<<i<<" "<<j<<" "<<q[l]<<" "<<f[a-1][i][j]+j<<" "<<f[a-1][i][q[l]]+q[l]<<endl;
f[a][i][j]=f[a-1][i][q[l]]+q[l]-j;
}
}
}
if(d[a]==4)
{
for(int i=1;i<=n;i++)
{
l=1,r=0;
for(int j=1;j<=m;j++)
{
if(c[i][j]=='x')
{
l=1,r=0;
f[a][i][j]=-inf;
continue;
}
while(l<=r&&j-q[l]>t[a]-s[a]+1)
l++;
while(l<=r&&f[a-1][i][j]-j>f[a-1][i][q[r]]-q[r])
r--;
q[++r]=j;//cerr<<i<<" "<<j<<" "<<q[l]<<endl;
f[a][i][j]=f[a-1][i][q[l]]+j-q[l];
}
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// cerr<<f[a][i][j]<<" ";
// cerr<<endl;
// }
// cerr<<endl;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans=max(ans,f[k][i][j]);
printf("%d\n",ans);
return 0;
}
/*
10 10 5 8 5
..........
......xxxx
.....xxxxx
.....xxxxx
..........
xxxx......
..........
..........
..........
..x.......
1 5 3
6 7 1
8 11 2
12 15 3
16 17 2
*/

bzoj 1499: [NOI2005]瑰丽华尔兹【dp+单调队列】的更多相关文章

  1. BZOJ1499:[NOI2005]瑰丽华尔兹(DP,单调队列)

    Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...

  2. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  3. bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

  4. BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列

    题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每一个时间段能够选择向给定的方向移动一段距离,求最长路径长 朴素DP的话,我们有T个时间段,每一个时间段有m*n个点,n个时间,一定会 ...

  5. BZOJ1499 [NOI2005]瑰丽华尔兹 【单调队列优化dp】

    题目 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫 ...

  6. 2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)

    传送门 单调队列优化dp好题. 这题其实很简单. 我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: ...

  7. bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp

    这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring ...

  8. ●BZOJ 1499 [NOI2005]瑰丽华尔兹

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1499 题解: 单调队列优化DP 定义 dp[t][x][y] 表示第t个时间段之后,处在(x ...

  9. 洛谷P2254 [NOI2005]瑰丽华尔兹(单调队列)

    传送门 题解 大概就是设$dp[i][x][y]$表示在第$i$个时间段,在$(x,y)$时的最大滑动距离 然后转移是$dp[i][x][y]=max(dp[i-1][x][y],dp[i][x'][ ...

随机推荐

  1. 在线修改MySQL大表的表结构

    由于某个临时需求,需要给在线MySQL的某个超过千万的表增加一个字段.此表在设计之时完全按照需求实现,并没有多余的保留字段. 我们知道在MySQL中如果要执行ALTER TABLE操作,MySQL会通 ...

  2. Linux下增加User及添加sudo权限

    运行adduser username 会默认建立同名的user,group,同时会要求输入用户密码及一些属性,完成之后OK. sudo chmod +w /etc/sudoers vi /etc/su ...

  3. MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate

    一.MongoDB聚合管道(Aggregation Pilpeline) 使用聚合管道可以对集合中的文档进行变换和组合. 主要功能:表的关联查询.数据统计 二.aggregate 管道操作符与表达式 ...

  4. ArcSDE数据库连接(直连、服务连)与GT_Geometry存

    http://ziliao1.com/Article/Show/48126AB1A8F563D35E3D0345677C906B 众说周知,ArcSDE空间数据库引擎提供了两种连接数据库的方式.一是服 ...

  5. 原来,表名和字段名不能在pdo中“参数化查询”

    https://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as ...

  6. OSX: 第三方部署Profile的方法和比較

    眼下至少有三个第三方部署Profile的方法. 一个Profile Handler, 是利用Launchd对制定文件夹改变而激活的机制,把须要的profiles文件斗存放在制定目标机器的文件夹内,系统 ...

  7. Win7 丢失MSVCR110.DLL的解决办法

    1 从下面的网站下载dll文件 http://www.ddooo.com/softdown/27034.htm   2 把该文件放到C:\Windows\SysWOW64目录下(64位系统)或者C:\ ...

  8. PAT-PAT (Advanced Level) Practise 1001. A+B Format (20) 【二星级】

    题目链接:http://www.patest.cn/contests/pat-a-practise/1001 题面: 1001. A+B Format (20) Calculate a + b and ...

  9. HDU 5285 wyh2000 and pupil(dfs或种类并查集)

    wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Other ...

  10. 基于编程人员Python学习第一章节

    基于廖雪峰的python零基础学习后,自我总结.适用于有一定基础的编程人员,对我而言,则是基于.net已有方面,通过学习,记录自我觉得有用的地方,便于后续回顾. 主要以快速定位内容,通过直观代码输入输 ...