传送门

单调队列优化dp好题。

这题其实很简单。

我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: relative;">O(T∗n∗m)O(T∗n∗m)的算法,就是以时间点与坐标转移。

然后我们可以改成时间段和坐标转移。

时间复杂度O(k∗n3)" role="presentation" style="position: relative;">O(k∗n3)O(k∗n3)

方程是:

f[k][x][y]=max(f[k−1][x′][y′]+dist(x,y,x′,y′))" role="presentation" style="position: relative;">f[k][x][y]=max(f[k−1][x′][y′]+dist(x,y,x′,y′))f[k][x][y]=max(f[k−1][x′][y′]+dist(x,y,x′,y′))

由于(x,y)" role="presentation" style="position: relative;">(x,y)(x,y)跟(x′,y′)" role="presentation" style="position: relative;">(x′,y′)(x′,y′)一定在同一行/列,因此对于每一个方向都可以用单调队列把复杂度优化掉一个n。

但这样空间不是最优的。

于是我模仿大佬的写法改成了滚动数组的写法(真难写)。

代码:

#include<bits/stdc++.h>
#define N 205
using namespace std;
int n,m,sx,sy,K,ans,f[N][N];
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
struct Node{int f,len;}q[N];
char mp[N][N];
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline int max(int a,int b){return a>b?a:b;}
inline void solve(int xx,int yy,int len,int dir){
    int hd=1,tl=0;
    for(int i=1;xx&&xx<=n&&yy&&yy<=m;++i,xx+=dx[dir],yy+=dy[dir]){
        if(mp[xx][yy]=='x')hd=1,tl=0;
        else{
            while(hd<=tl&&q[tl].f-q[tl].len<f[xx][yy]-i)--tl;
            q[++tl]=(Node){f[xx][yy],i};
            if(q[tl].len-q[hd].len>len)++hd;
            f[xx][yy]=q[hd].f-q[hd].len+i,ans=max(ans,f[xx][yy]);
        }
    }
}
int main(){
    n=read(),m=read(),sx=read(),sy=read(),K=read();
    for(int i=1;i<=n;++i)scanf("%s",mp[i]+1);
    memset(f,-0x3f,sizeof(f)),f[sx][sy]=0;
    for(int i=1;i<=K;++i){
        int s=read(),t=read(),dir=read()-1,len=t-s+1;
        if(!dir)for(int j=1;j<=m;++j)solve(n,j,len,dir);
        else if(dir==1)for(int j=1;j<=m;++j)solve(1,j,len,dir);
        else if(dir==2)for(int j=1;j<=n;++j)solve(j,m,len,dir);
        else for(int j=1;j<=n;++j)solve(j,1,len,dir);
    }
    cout<<ans;
    return 0;
}

2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)的更多相关文章

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

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

  2. bzoj1499 [NOI2005]瑰丽华尔兹——单调队列优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 朴素DP方程很好想,以右移为例,就是 f[i][x][y]=max(f[i][x][y ...

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

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

  4. 2018.09.10 bzoj1855: [Scoi2010]股票交易(单调队列优化dp)

    传送门 单调队列优化dp好题. 有一个很明显的状态设置是f[i][j]表示前i天完剩下了j分股票的最优值. 显然f[i][j]可以从f[i-w-1][k]转移过来. 方程很好推啊. 对于j<kj ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

  6. 2018.09.23 孙悟空大战鲤鱼精(单调队列优化dp)

    描述 孙悟空大战鲤鱼精,孙悟空在通天河遇到鲤鱼精,他嫉恶如仇,看见妖精就手痒(忘了自己是妖精).但是鲤鱼精知道孙悟空的厉害,在孙悟空来到通天河,鲤鱼精就跑到了河对面.于是孙悟空就去追鲤鱼精. 我们可以 ...

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

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

  8. BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列

    题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每一个时间段能够选择向给定的方向移动一段距离,求最长路径长 朴素DP的话,我们有T个时间段,每一个时间段有m*n个点,n个时间,一定会 ...

  9. bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp

    这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring ...

随机推荐

  1. leetcode227

    class Solution { public: stack<int> OPD; stack<char> OPR; int calculate(int num1, int nu ...

  2. 前段开发-css-总结

    应用参考https://www.cnblogs.com/alice-bj/p/8972299.html CSS:层叠样式表(Cascading Style Sheets) 1.css的特征 一.css ...

  3. focusin 事件| focusout事件

    focusin 定义和用法 当元素(或在其内的任意元素)获得焦点时发生 focusin 事件. 当在元素或在其内的任意元素上发生 focus 事件时,focusin() 方法添加要运行的函数. 与 f ...

  4. 认识serviceLoader

    最近在研究系统设计方面的东西,发现有很多通用的解决方案,包括spring配置扩展以及serviceLoader的应用,这里简单记录下serviceLoader的简单应用,网上例子很多,大同小异,本人觉 ...

  5. mongodb基础学习2-基本CRUD

    接着学习一下mongodb的基本的CRUD 先列出基本知识点,再给出相关的例子 增:语法: db.collectionName.insert(document); 1: 增加单篇文档,不指定_id时会 ...

  6. 两个关于URL解析的例子

    例一: /* 解析URL查寻串中的name=value参数对 将name=value对存储在对象属性中,并返回对象 alert(getQuery().name) */ function getQuer ...

  7. 【转】 关于寄存器ESP和EBP的一些理解

    原文: http://blog.csdn.net/zsJum/article/details/6117043 一直对寄存器ESP和EBP的概念总是有些混淆,查看定义ESP是栈顶指针,EBP是存取堆栈指 ...

  8. 电影TS、TC、BD版和HD版

    HD的意思是指HDTV,HDTV指网上下载的高清影片,它的画面品质会比BD稍差,主要表现为亮度不足,色彩不自然等.BD是指蓝光(Blu-ray)或称蓝光盘(Blu-ray Disc,缩写为BD),目前 ...

  9. 使用css技术代替传统的frame技术

    http://www.dynamicdrive.com/style/layouts/item/css-left-frame-layout/ <!--Force IE6 into quirks m ...

  10. oracle 字符处理

    oracle获取字符串长度函数length()和hengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算stri ...