洛谷2254 BZOJ1499 瑰丽华尔兹题解
一个很容易想到的做法就是用f[i][j][t]表示t时刻在i,j处的可以滑动的最大值
f[i][j][t]=max(f[i][j][t-1],f[*i][*j][t-1]),这样大力转移
只不过会TLE+MLE
所以我们要进行一下优化
f[i][j][k]表示在第k个时间段在i,j处的可以滑动的最大值
f[i][j][k]=max(f[*i][*j][k-1]+dis(i,j,*i,*j,f[i][j][k-1])
//*i,*j表示上一个合理的位置
注意到我们的i,与*i,以及j与*j一定有一个相等,即它们在同一行或者同一列
所以我们可以根据滑动的路径一行一行或者一列一列进行转移
而这个位置的可以转移来的位置即是它向前len长度的之内的位置
这与滑动窗口很类似,可以用单调队列来维护max(f[*i][*j][k-1])
然后在考虑障碍,我们发现一旦遇到障碍,之前的答案都不能转移过来
所以在有障碍是清空队列就好了
还有一个常规的优化,就是f[i][j][k]仅与f[i][j][k-1]有关,所以可以利用滚动数组进行优化
# include<iostream>
# include<cstdio>
# include<cmath>
# include<cstring>
# include<algorithm>
using namespace std;
const int mn = ;
const int dx[]={,-,,,};
const int dy[]={,,,-,};
struct node{int val,pos;};
node q[mn];
node make_node(int x,int y)
{
node tmp;tmp.val=x,tmp.pos=y;
return tmp;
}
int n,m,sx,sy,k;
int dp[mn][mn],ans,d;
char s[mn];
bool vis[mn][mn];
void work(int x,int y,int len)
{
int tail=,head=;
for(int i=;x>= && x<=n && y>= && y<=m;i++,x+=dx[d],y+=dy[d])
{
if(!vis[x][y]) tail=,head=;
else {
while(tail<=head && q[head].val+i-q[head].pos<=dp[x][y]) head--;
q[++head] = make_node(dp[x][y],i);//dp[x][y]实际上是dx[x][y][k-1]
//BZOJ不支持c++11,写成q[++head]=node{dp[x][y],i}会CE
while(tail<=head && q[head].pos-q[tail].pos>len) tail++;
dp[x][y] = q[tail].val+i-q[tail].pos;//现在dp[x][y]才是dp[x][y][k]
ans=max(ans,dp[x][y]);
}
}
}
int main()
{
int x,y,z;
scanf("%d%d%d%d%d",&n,&m,&sx,&sy,&k);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
for(int j=;j<=m;j++)
if(s[j]=='.') vis[i][j]=;
else vis[i][j]=;
}
memset(dp,0xf3,sizeof(dp));
dp[sx][sy]=;
for(int i=;i<=k;i++)
{
scanf("%d%d%d",&x,&y,&d);
if(d==)
for(int j=;j<=m;j++) work(n,j,y-x+);
if(d==)
for(int j=;j<=m;j++) work(,j,y-x+);
if(d==)
for(int j=;j<=n;j++) work(j,m,y-x+);
if(d==)
for(int j=;j<=n;j++) work(j,,y-x+);
}
printf("%d",ans);
return ;
}
洛谷2254 BZOJ1499 瑰丽华尔兹题解的更多相关文章
- 洛谷P2254 [NOI2005]瑰丽华尔兹(单调队列)
传送门 题解 大概就是设$dp[i][x][y]$表示在第$i$个时间段,在$(x,y)$时的最大滑动距离 然后转移是$dp[i][x][y]=max(dp[i-1][x][y],dp[i][x'][ ...
- 洛谷 P2254 [NOI2005]瑰丽华尔兹(单调栈优化DP)
题目描述 不妨认为舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地.钢琴可以在空地上滑动,但不能撞上家具或滑出舞厅,否则会损坏钢琴和家具,引来难缠的船长.每个时刻,钢琴都会随 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- [洛谷P1823]音乐会的等待 题解(单调栈)
[洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...
- BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 洛谷 p1516 青蛙的约会 题解
dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...
随机推荐
- 深入浅出 Java Concurrency (2): 原子操作 part 1[转]
从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始).很多情况下我们只是需要一个简单的 ...
- BM线性递推
#include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #defi ...
- Scrapy下载中间件的优先级(神踏马值越小优先级越高)
自从之前看的一篇讲Scrapy下载中间件的文章后,一直认为设置里下载中间件的优先级数值越小,越优先,最近要抓的网站反爬增强了,所以需要使用代理ip,但是由于使用的是免费代理以至于经常失效,需要对失效的 ...
- SpringBooot- 访问时,默认有弹出认证
SpringBooot- 访问时,默认有弹出认证 springboot启动成功后,访问请求时,默认弹出窗口,需登录认证. 原因: 是由于使用了springsecurity的默认安全策略,解决方案:启动 ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- POJ 2533 最小上升子序列
D - POJ 2533 经典DP-最长上升子序列 A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let th ...
- bzoj 1053 [HAOI2007]反素数ant——关于质数的dfs / 打表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1053 写了个打表程序. #include<iostream> #include& ...
- View的滑动原理和多种滑动方法
参考链接: http://blog.csdn.net/chunqiuwei/article/details/50679568# http://blog.csdn.net/zly921112/artic ...
- 20190814-A Second
一秒,或是,第二次? 这考试也太频繁了吧…… 考试过程: 看三道题. T1没思路. 然后去厕所清醒了一下. 在厕所的时候,突然想到可以离散化. 于是就这么搞了. 然后去写T2. T2好像是数学题. 于 ...
- LintCode_453 将二叉树拆成链表
题目 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 样例 1 \ 1 2 / \ \ 2 5 => 3 / \ \ ...