[BZOJ 1499] 瑰丽华尔兹
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1499
Solution :
能立即发现这是和动态规划相关的题目
令f[t][i][j]表示第t段时间时,钢琴位于(i,j)处时,从第1段时间到第t段时间的最长滑行路程。
f[t][i][j]=max{ f[t−1][i last][j last] + dist{ (i last,j last) , (i,j) } }
由于四个方向的处理类似,这里以向右举例:
f[t][i][j]=max{ f[t−1][i][j′] + (j−j′) }=j+max{f[t−1][i][j′]−j′} , j−j′≤end-start+1
对于每个f[t][i][j],我们就是找到最大的max{f[t−1][i][j′]−j′},同时使得j−j′≤end-start+1
由于j-j'单调递减,每次需要弹出队首元素,我们使用单调队列而非单调栈来维护这个序列
#include <bits/stdc++.h> using namespace std;
const int MAXN=;
const int INF=<<; inline int read()
{
char ch;int num,f=;
while(!isdigit(ch=getchar())) f|=(ch=='-');
num=ch-'';
while(isdigit(ch=getchar())) num=num*+ch-'';
return f?-num:num;
} int n,m,X,Y,k,dp[][MAXN][MAXN],d=; //滚动数组优化
char dat[MAXN][MAXN]; int st,end,dir,res=,que[MAXN],t[MAXN];
int dx[]={,-,,,},dy[]={,,,-,}; void solve(int x,int y)
{
int l=,r=,now=;
while(x>= && x<=n && y>= && y<=m)
{
if(dat[x][y]=='x') l=,r=;
while(l<=r && now-t[l]>end-st+) l++; //弹出队首
while(l<=r && que[r]<dp[d^][x][y]-now) r--; //保证递减的单调性
que[++r]=dp[d^][x][y]-now;t[r]=now;
dp[d][x][y]=que[l]+now; res=max(res,dp[d][x][y]);now++;
x+=dx[dir];y+=dy[dir];
}
} int main()
{
cin >> n >> m >> X >> Y >> k;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin >> dat[i][j];
memset(dp,0x80,sizeof(dp)); dp[][X][Y]=;
for(int i=;i<=k;i++)
{
st=read(),end=read(),dir=read();
d^=;
if(dir==)
for(int i=;i<=m;i++) solve(n,i);
else if(dir==)
for(int i=;i<=m;i++) solve(,i);
else if(dir==)
for(int i=;i<=n;i++) solve(i,m);
else
for(int i=;i<=n;i++) solve(i,);
}
cout << res;
return ;
}
[BZOJ 1499] 瑰丽华尔兹的更多相关文章
- BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP
BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...
- 单调队列优化DP || [NOI2005]瑰丽华尔兹 || BZOJ 1499 || Luogu P2254
题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t ...
- NOI2005瑰丽华尔兹
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 893 Solved: 508[Submit][Status] ...
- 【BZOJ1499】瑰丽华尔兹(动态规划)
[BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...
- bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1802 Solved: 1097[Submit][Status ...
- 【BZOJ1499】【NOI2005】瑰丽华尔兹(动态规划)
[BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...
- luogu P2254 [NOI2005]瑰丽华尔兹
题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[ ...
- [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 ...
随机推荐
- [ZJOI2007]棋盘制作 (单调栈)
[ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间 ...
- Pycharm 创建 Django admin 用户名和密码
1. 问题 使用PyCharm 创建完Django 项目 想登录admin 页面 却不知道用户名和密码. 用的默认sqlit 2.解决办法 2.1 打开manage.py 控制界面 ...
- php设定错误和异常处理可使用的函数
1.register_shutdown_function 使用场景:当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,这个函数会被调用. 函数介绍: void register_shutdown ...
- lhgdialog的传值问题
一前言 今天就离职了,顺便把还没有记载下来得Js有关知识给记载下来,其实这个是lhgdialog.js中的传值问题.就是弹出框选择数据后加载到父页面上,自己用html做了测试. 二:内容 html代码 ...
- c#之字符串函数
1.常用的字符串函数 Compare 比较字符串的内容,考虑文化背景(场所),确定某些字符是否相等 int Compare(string str1,string str2) int Compare(s ...
- Linux中短横线(-)小记
在Linux中短横线(-)可以表示输出流,具体用法如下. 搭配cat cat - 如果指定cat的文件为-,表示从标准输入读取(和直接使用cat,好像没什么区别) 搭配| echo 123 | cat ...
- 设置session过期时间
1如下是登录注册和记住密码的功能: # -*- coding: utf-8 -*- def cms_login(request): if request.method == 'GET': return ...
- python学习笔记 async and await
用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异 ...
- 网络知识===cookie 、session、JSESSIONID的区别
cookie .session ? 让我们用几个例子来描述一下cookie和session机制之间的区别与联系.笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微 ...
- Oracle rman 全备份的一个小例子
run{ allocate channel d1 type disk; backup database format='/u01/backup/%T_%d_%s.bak'; sql 'alter ...