题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499

简单的单调队列优化dp。(然而当时却WA得不行。今天总算填了坑)

注意滚动数组赋初值应当继承上一次的该位置的值。还有转移的时候取个max。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,INF=;//
int n,m,x,y,T,l,r,d,dp[][N][N],ans,q[N],h,t;
char ch[N][N];
int main()
{
scanf("%d%d%d%d%d ",&n,&m,&x,&y,&T);
for(int i=;i<=n;i++)cin>>(ch[i]+);
memset(dp,-,sizeof dp);dp[][x][y]=;
for(int s=;s<=T;s++)
{
scanf("%d%d%d",&l,&r,&d);int u=(s&),v=!u;int w=r-l+;
if(d==)
{
// q[0]=n;
for(int j=;j<=m;j++)
{
for(int i=n;i;i--)
{
dp[u][i][j]=dp[v][i][j];//
if(ch[i][j]=='x')
{
// h=0;t=0;q[0]=i-1;continue;
h=;t=;continue;
}
while(h<=t&&q[h]-i>w)h++;
while(h<=t&&dp[v][i][j]>=dp[v][q[t]][j]+(q[t]-i))t--;q[++t]=i;
if(dp[v][q[h]][j]>-INF||(q[h]==x&&j==y))dp[u][i][j]=max(dp[u][i][j],dp[v][q[h]][j]+(q[h]-i));//
// printf("dp[%d][%d]=%d(dp[%d][%d]=%d i=%d q[%d]=%d)\n",i,j,dp[u][i][j],q[h],j,dp[v][q[h]][j],i,h,q[h]);
}
h=;t=;//
}
}
else if(d==)
{
// q[0]=1;
for(int j=;j<=m;j++)
{
for(int i=;i<=n;i++)
{
dp[u][i][j]=dp[v][i][j];//
if(ch[i][j]=='x')
{
// h=0;t=0;q[0]=i+1;continue;
h=;t=;continue;
}
while(h<=t&&i-q[h]>w)h++;
while(h<=t&&dp[v][i][j]>=dp[v][q[t]][j]+(i-q[t]))t--;q[++t]=i;
if(dp[v][q[h]][j]>-INF||(q[h]==x&&j==y))dp[u][i][j]=max(dp[u][i][j],dp[v][q[h]][j]+(i-q[h]));//
// printf("dp[%d][%d]=%d(dp[%d][%d]=%d i=%d q[%d]=%d)\n",i,j,dp[u][i][j],q[h],j,dp[v][q[h]][j],i,h,q[h]);
}
h=;t=;//
}
}
else if(d==)
{
// q[0]=m;
for(int i=;i<=n;i++)
{
for(int j=m;j;j--)
{
dp[u][i][j]=dp[v][i][j];//
if(ch[i][j]=='x')
{
// h=0;t=0;q[0]=j-1;continue;
h=;t=;continue;
}
while(h<=t&&q[h]-j>w)h++;
while(h<=t&&dp[v][i][j]>=dp[v][i][q[t]]+(q[t]-j))t--;q[++t]=j;
if(dp[v][i][q[h]]>-INF||(i==x&&q[h]==y))dp[u][i][j]=max(dp[u][i][j],dp[v][i][q[h]]+(q[h]-j));//
// printf("dp[%d][%d]=%d(dp[%d][%d]=%d j=%d q[%d]=%d)\n",i,j,dp[u][i][j],i,q[h],dp[v][i][q[h]],j,h,q[h]);
}
h=;t=;//
}
}
else{
// q[0]=1;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
dp[u][i][j]=dp[v][i][j];//
if(ch[i][j]=='x')
{
// h=0;t=0;q[0]=j+1;continue;
h=;t=;continue;
}
while(h<=t&&j-q[h]>w)h++;
while(h<=t&&dp[v][i][j]>=dp[v][i][q[t]]+(j-q[t]))t--;q[++t]=j;
if(dp[v][i][q[h]]>-INF||(i==x&&q[h]==y))dp[u][i][j]=max(dp[u][i][j],dp[v][i][q[h]]+(j-q[h]));//
// printf("dp[%d][%d]=%d(dp[%d][%d]=%d j=%d q[%d]=%d)\n",i,j,dp[u][i][j],q[h],j,dp[v][q[h]][j],j,h,q[h]);
}
h=;t=;//
}
}
}
int u=(T&);
for(int i=;i<=n;i++) for(int j=;j<=m;j++) ans=max(ans,dp[u][i][j]);
printf("%d",ans);
return ;
}

bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp的更多相关文章

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

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

  2. bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1802  Solved: 1097[Submit][Status ...

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

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

  4. bzoj1499 [NOI2005]瑰丽华尔兹——单调队列优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 朴素DP方程很好想,以右移为例,就是 f[i][x][y]=max(f[i][x][y ...

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

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

  6. 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP

    [BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...

  7. BZOJ 3126 [USACO2013 Open]Photo (单调队列优化DP)

    洛谷传送门 题目大意:给你一个长度为$n$的序列和$m$个区间,每个区间内有且仅有一个1,其它数必须是0,求整个序列中数字1最多的数量 神题,竟然是$DP$ 定义$f_{i}$表示第i位放一个1时,最 ...

  8. bzoj 3831 Little Bird (单调队列优化dp)

    /*先贴个n*n的*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100 ...

  9. bzoj 3126: [Usaco2013 Open]Photo——单调队列优化dp

    Description 给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点 Input * Line 1: Two integers N and M. * Lines 2..M+ ...

随机推荐

  1. MySql判断汉字、日期、数字的具体函数

    几个平常用的mysql函数,MySql判断汉字.日期.数字的具体函数分享给大家,具体内容如下 1.判断字符串是否为汉字 返回值:1-汉字 0-非汉字 ? 1 2 3 4 5 6 7 8 9 10 11 ...

  2. php异常处理笔记

    <?php header("Content-type:text/html;charset=utf-8"); // try // { // //业务处理 错误时抛出异常. // ...

  3. java实现定时任务的三种方法 - 转载

    java实现定时任务的三种方法 /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简 ...

  4. Java中遍历map的四种方法 - 转载

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  5. Valid Number,判断是否为合法数字

    问题描述: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " ...

  6. Sudoku Solver, 求数独

    问题描述:填充数独表中空元素.空元素为'.' 算法分析:没填充一个数,都要看这个数所在的行,列,小矩阵是否合法.然后还要看整个数独表是否正确,而判断整个数独表只能通过递归,因为前一个结果的判断要依赖后 ...

  7. Flume-NG源码阅读之FileChannel

    FileChannel是flume一个非常重要的channel组件,非常常用.这个channel非常复杂,涉及的文件更多涉及三个包:org.apache.flume.channel.file.org. ...

  8. 探究platform_driver中“多态”思想

    问题最初是下面的两段代码引出的: static struct platform_driver sonypi_driver = { .driver = { .name = "sonypi&qu ...

  9. 使用VS自带的工具分析.NET程序的性能

    (转自:http://www.cnblogs.com/DebugLZQ/archive/2012/07/10/2585245.html) 这篇博文给大家分享的是,如何使用VS自带的性能分析工具来分析我 ...

  10. 偶然遇到的samba服务器权限问题

    也许有一些参考价值. CentOS 6.4使用命令service smb start启动samba服务器,在配置文件都正确,而且对应的共享目录权限也正确,使用smbpasswd添加了用户,这之后,使用 ...