【BZOJ1499】瑰丽华尔兹(动态规划)

题面

BZOJ

题解

先写部分分

设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数

这样子每一步要么停要么走

时间复杂度\(O(nmt)\)

得分\(40~70\)分

(据说这样能过???)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 210
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
char g[MAX][MAX];
int ans,n,m,X,Y,K,L[MAX],R[MAX],D[MAX];
int d[5][2]={0,0,-1,0,1,0,0,-1,0,1};
int f[2][MAX][MAX],T[MAX*MAX];
int main()
{
n=read();m=read();X=read();Y=read();K=read();
for(int i=1;i<=n;++i)scanf("%s",g[i]+1);
for(int i=1;i<=K;++i)L[i]=read(),R[i]=read(),D[i]=read();
for(int i=1;i<=K;++i)
for(int j=L[i];j<=R[i];++j)T[j]=D[i];
memset(f,-1,sizeof(f));
f[0][X][Y]=0;
int nw=1,pw=0;
for(int tt=1;tt<=R[K];++tt,nw^=1,pw^=1)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)f[nw][i][j]=-1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(f[pw][i][j]==-1)continue;
int xx=i+d[T[tt]][0],yy=j+d[T[tt]][1];
f[nw][i][j]=max(f[nw][i][j],f[pw][i][j]);
if(xx<1||yy<1||xx>n||yy>m)continue;
if(g[xx][yy]=='x')continue;
f[nw][xx][yy]=max(f[nw][xx][yy],f[pw][i][j]+1);
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
ans=max(ans,f[R[K]&1][i][j]);
printf("%d\n",ans);
return 0;
}

发现转移可以用单调队列优化

于是分四种情况进行讨论

用单调队列优化转移即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 210
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
char g[MAX][MAX];
int ans,n,m,X,Y,K,L[MAX],R[MAX],D[MAX];
int d[5][2]={0,0,-1,0,1,0,0,-1,0,1};
int f[2][MAX][MAX],T[MAX*MAX];
int Q[MAX],h,t;
int main()
{
n=read();m=read();X=read();Y=read();K=read();
for(int i=1;i<=n;++i)scanf("%s",g[i]+1);
for(int i=1;i<=K;++i)L[i]=read(),R[i]=read(),D[i]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)f[0][i][j]=-1e9;
f[0][X][Y]=0;
int nw=1,pw=0;
for(int tt=1;tt<=K;++tt,nw^=1,pw^=1)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)f[nw][i][j]=f[pw][i][j];
if(D[tt]==1)
for(int j=1;j<=m;++j)
{
h=1;t=0;
for(int i=n;i;--i)
{
if(g[i][j]=='x'){h=1;t=0;continue;}
while(h<=t&&Q[h]-i>R[tt]-L[tt]+1)++h;
while(h<=t&&f[pw][Q[t]][j]+Q[t]<=f[pw][i][j]+i)--t;
Q[++t]=i;
if(h<=t)f[nw][i][j]=f[pw][Q[h]][j]+Q[h]-i;
}
}
else if(D[tt]==2)
for(int j=1;j<=m;++j)
{
h=1;t=0;
for(int i=1;i<=n;++i)
{
if(g[i][j]=='x'){h=1;t=0;continue;}
while(h<=t&&i-Q[h]>R[tt]-L[tt]+1)++h;
while(h<=t&&f[pw][Q[t]][j]-Q[t]<=f[pw][i][j]-i)--t;
Q[++t]=i;
if(h<=t)f[nw][i][j]=f[pw][Q[h]][j]+i-Q[h];
}
}
else if(D[tt]==3)
for(int i=1;i<=n;++i)
{
h=1;t=0;
for(int j=m;j;--j)
{
if(g[i][j]=='x'){h=1;t=0;continue;}
while(h<=t&&Q[h]-j>R[tt]-L[tt]+1)++h;
while(h<=t&&f[pw][i][Q[t]]+Q[t]<=f[pw][i][j]+j)--t;
Q[++t]=j;
if(h<=t)f[nw][i][j]=f[pw][i][Q[h]]+Q[h]-j;
}
}
else
for(int i=1;i<=n;++i)
{
h=1;t=0;
for(int j=1;j<=m;++j)
{
if(g[i][j]=='x'){h=1;t=0;continue;}
while(h<=t&&j-Q[h]>R[tt]-L[tt]+1)++h;
while(h<=t&&f[pw][i][Q[t]]-Q[t]<=f[pw][i][j]-j)--t;
Q[++t]=j;
if(h<=t)f[nw][i][j]=f[pw][i][Q[h]]+j-Q[h];
}
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
ans=max(ans,f[K&1][i][j]);
printf("%d\n",ans);
return 0;
}

【BZOJ1499】瑰丽华尔兹(动态规划)的更多相关文章

  1. Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化

    设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子 转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就 ...

  2. 洛谷2254 BZOJ1499 瑰丽华尔兹题解

    洛谷链接 BZ链接 一个很容易想到的做法就是用f[i][j][t]表示t时刻在i,j处的可以滑动的最大值 f[i][j][t]=max(f[i][j][t-1],f[*i][*j][t-1]),这样大 ...

  3. 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)

    [BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...

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

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

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

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

  6. [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]

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

  7. DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)

    codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Descripti ...

  8. NOI2005瑰丽华尔兹

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

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

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

随机推荐

  1. IDEA Default模式下的常用快捷键

    功 能 快 捷 键 备 注 Back Up Ctr + Alt + Left Forword Ctr + Alt + Right Previous Tab Alt + Left Next Tab Al ...

  2. Centos7新功能

    Centos7 单用户模式   centos7里不再有0-6启动级别,而是4个target   graphical.target  多人模式,支持图形和命令行两种登录,对应之前的3,5级别   mul ...

  3. 微信小程序内嵌网页 网站生成小程序

    1. 进入小程序后台 - 设置 - 开发设置 2. 添加业务域名(小程序只支持https) 3. 小程序代码 <web-view src="网址"></web-v ...

  4. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  5. MySQL的InnoDB引擎与MyISAM引擎

    MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...

  6. # *Qt for Com 交互*

    Qt COM Q_PROPERTY ActiveX properties public slots ActiveX methods signals ActiveX events Qt 属性支持的数据类 ...

  7. 《精通android网络开发》--使用Socket实现数据通信

    No1: 网络传输应用通常使用TCP.IP或UDP这三种协议实现数据传输.在传输数据的过程中,需要通过一个双向的通信连接实现数据的交互.在这个传输过程中,通常将这个双向链路的一端称为Socket,一个 ...

  8. yaf框架学习文件配置

    文件配置: 在配置php支持yaf的时候,可以设置一个参数yaf.environ:把本地开发设置成develop.测试环境配置成test.生产环境配置成product. [yaf] extension ...

  9. hexo持续更新记录

    port:50187

  10. shell脚本 字串截取 正则表达式

    字串处理 子串截取方法一:使用${}表达式格式:echo ${x:起始位置:长度}(起始位置编号从0开始,可省略) 方法二:使用expr substr格式:expr substr "$x&q ...