【BZOJ1499】瑰丽华尔兹(动态规划)
【BZOJ1499】瑰丽华尔兹(动态规划)
题面
题解
先写部分分
设\(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】瑰丽华尔兹(动态规划)的更多相关文章
- Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化
设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子 转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就 ...
- 洛谷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]),这样大 ...
- 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)
[BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...
- 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP
[BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1802 Solved: 1097[Submit][Status ...
- [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1714 Solved: 1042[Submit][Status ...
- DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)
codevs 1748 瑰丽华尔兹 2005年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Descripti ...
- NOI2005瑰丽华尔兹
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 893 Solved: 508[Submit][Status] ...
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
随机推荐
- pandas读取各类sql数据源
大数据分析中,我们经常需要使用pandas工具读取各类数据源并将结果保存到数据库中. 本文总结了一些读取和写入常用数据库数据的一些方法,包括mysql,oracle,impala等. 其中读取数据库数 ...
- centos6下从源码安装setuptools和pip
1. 下载setuptools及pip的源码包 setuptools与pip都是python的模块 setuptools源码包: https://pypi.python.org/pypi/setupt ...
- 使用EL表达式调用java方法
首先,新建一个类,类中写一个静态方法 public class PrivilegeUtils { public static Boolean checkPrivilegeByName(User use ...
- python爬取快手视频 多线程下载
就是为了兴趣才搞的这个,ok 废话不多说 直接开始. 环境: python 2.7 + win10 工具:fiddler postman 安卓模拟器 首先,打开fiddler,fiddler作为htt ...
- SQL注入漏洞产生的原因是什么?怎么防止?XSS呢?
SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行. 防止SQL注入: 1.开启配置文件中的magi ...
- filter-api文档
git地址:https://github.com/jiqianqin/filters 不断优化中,欢迎加入讨论- filter-tags 效果图: 参数 说明 格式 备注 data 展示的数据 [{ ...
- python——Django项目模板
views.py # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts impor ...
- C编程之 一个容易忽视但是十分严重的小错误
while(...) { ...if(a=b) continue; } 调试时就一直执行continue.一直找不到原因,后面才发现是少一个"=": 还有一次就是也是在if中,if ...
- String、StringBuffer、与StringBuilder的区别
转载自博客园,原文链接:String.StringBuffer.与StringBuilder的区别 相信大家都知道StringBuffer.StringBuilder,但是这两个的用法都差不多,到底有 ...
- LOJ6001 - 「网络流 24 题」太空飞行计划
原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...