【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. pandas读取各类sql数据源

    大数据分析中,我们经常需要使用pandas工具读取各类数据源并将结果保存到数据库中. 本文总结了一些读取和写入常用数据库数据的一些方法,包括mysql,oracle,impala等. 其中读取数据库数 ...

  2. centos6下从源码安装setuptools和pip

    1. 下载setuptools及pip的源码包 setuptools与pip都是python的模块 setuptools源码包: https://pypi.python.org/pypi/setupt ...

  3. 使用EL表达式调用java方法

    首先,新建一个类,类中写一个静态方法 public class PrivilegeUtils { public static Boolean checkPrivilegeByName(User use ...

  4. python爬取快手视频 多线程下载

    就是为了兴趣才搞的这个,ok 废话不多说 直接开始. 环境: python 2.7 + win10 工具:fiddler postman 安卓模拟器 首先,打开fiddler,fiddler作为htt ...

  5. SQL注入漏洞产生的原因是什么?怎么防止?XSS呢?

    SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行. 防止SQL注入: 1.开启配置文件中的magi ...

  6. filter-api文档

    git地址:https://github.com/jiqianqin/filters 不断优化中,欢迎加入讨论- filter-tags 效果图: 参数 说明 格式 备注 data 展示的数据 [{ ...

  7. python——Django项目模板

    views.py # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts impor ...

  8. C编程之 一个容易忽视但是十分严重的小错误

    while(...) { ...if(a=b) continue; } 调试时就一直执行continue.一直找不到原因,后面才发现是少一个"=": 还有一次就是也是在if中,if ...

  9. String、StringBuffer、与StringBuilder的区别

    转载自博客园,原文链接:String.StringBuffer.与StringBuilder的区别 相信大家都知道StringBuffer.StringBuilder,但是这两个的用法都差不多,到底有 ...

  10. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...