传送门

单调队列优化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. ABAP-BarCode-3-调用第三方控件BarTender实现打印

    1.BarTender软件安装及注册 2.BarTender设置好打印模板 3.ABAP生成TXT文件放置FTP服务器指定文件夹 4.BarTender轮询FTP服务器文件夹中的TXT,并按照模板打印 ...

  2. eclipse在运行main方法时在console里面报内存溢出的错误解决办法

    修改JVM的配置. window-->preferences-->Java-->installedJres选中使用的jdk/jre版本 点击右边的edit在弹出的对话框中的[Defa ...

  3. objective C, parse json时注意事项

    例: dict为从API请求返回的json调用 NSJSONSerialization JSONObjectWithData:方法得到的NSDictionary实例. 当执行以下语句时linkStri ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Filter接口编写过滤器

      Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程.为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用过滤器对信息 ...

  6. RabbitMQ 高可用集群搭建

    面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ p ...

  7. Android中MD5加密

    最近项目中遇到MD5加密,代码很简单,又是死代码,不过要注意当长度不足32的时候要补个0.下面是具体代码,直接拷贝就能用. public static String getMD5(String str ...

  8. 第八章 高级搜索树 (b2)B-树:结构

  9. VS IIS 注册 以及IIS浏览提示无权限访问

    VS2008 IIS重新注册2008-11-21 9:06无法显示XML页--名称以无效字符开头2008-10-17 15:19无法显示XML页--名称以无效字符开头.iis处理资源时出错的解决办法2 ...

  10. 【转】VS2012 中文版转英文版 英文版转中文版 界面语言切换

    [1]下载VS2012的语言包,各种语言包都有,下载对应的即可. 微软官网衔接地址:vs2012 语言包  http://www.microsoft.com/zh-CN/download/detail ...