洛谷2254

给你k次移动

每次移动给你一个时间段 a,b和方向dir

地图上有障碍物

为了不撞上障碍物你可以施法让箱子停下来

问箱子可以走的最长路

((以下是洛谷的题解))

/*首先考虑对于时间t来dp: f[t][i][j]表示在第t时刻在第i行第j列所能获得的最长距离。

转移方程:f[t][i][j]=max(f[t-1][i][j],f[t][i*][j*]+1)(i*,j*为上一个合理的位置) 这样时间复杂度为O(TNM),可以过50%,但对于100%TLE且MLE。

所以必须优化,首先把时间t换成区间k, 令f[k][i][j]表示在第k段滑行区间中在位置i,

j所能获得最长距离 注意到在第k段时间内只能向某个方向最多走x步(x为区间长度),

得到转移方程 f[k][i][j]=max(f[k-1][i][j],f[k][i*][j*]+dis(i,j,i*,j*))(i*,j*为上一个合理的位置) 这个做法的时间复杂度是O(kn^3),会超时,

需要进一步优化 用单调队列优化掉内层的一个n,就可以做到O(kn^2),可以AC,

本代码中还使用了滚动数组优化 用单调递减队列求最大值时,遇到障碍清空整个队列即可,另外队列比较时需要加上偏移量dis*/

 #include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define first fi
#define second se
#define pw(x) (1ll << (x))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rep(i,l,r) for(int i=(l);i<(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define eps 1e-9
#define PIE acos(-1)
#define cl(a,b) memset(a,b,sizeof(a))
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define lson l , mid , ls
#define rson mid + 1 , r , rs
#define ls (rt<<1)
#define rs (ls|1)
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define freopen freopen("in.txt","r",stdin);
#define cfin ifstream cin("in.txt");
#define lowbit(x) (x&(-x))
#define sqr(a) a*a
#define ll long long
#define ull unsigned long long
#define vi vector<int>
#define pii pair<int, int>
#define dd(x) cout << #x << " = " << (x) << ", "
#define de(x) cout << #x << " = " << (x) << "\n"
#define endl "\n"
using namespace std;
//**********************************
const int maxn=;
const int dx[]={,-,,,},dy[]={,,,-,};
int n,m,X,Y,k;
char pic[maxn][maxn];
int dp[maxn][maxn];
int ans;
struct node{
int id,v;
}que[maxn];
//**********************************
inline bool in(int x,int y)
{
return x>=&&x<=n&&y>=&&y<=m;
}
void solve(int x,int y,int len,int dir)
{
int head=,tail=;
for(int i=;in(x,y);++i,x+=dx[dir],y+=dy[dir]){
if(pic[x][y]=='x') head=,tail=;
else {
while(head<=tail&&que[tail].v+i-que[tail].id<dp[x][y])tail--;
que[++tail]=node{i,dp[x][y]};
if(que[tail].id-que[head].id>len)++head;
dp[x][y]=que[head].v+i-que[head].id;
ans=max(ans,dp[x][y]);
}
}
}
//**********************************
int main()
{
// freopen;
ans=;
scanf("%d %d %d %d %d",&n,&m,&X,&Y,&k);
cl(dp,-INF);dp[X][Y]=;
FOR(i,,n)scanf("%s",pic[i]+);
// FOR(i,1,n)printf("%s\n",pic[i]+1);
FOR(i,,k){
int a,b,dir;
scanf("%d %d %d",&a,&b,&dir);
int len=b-a+;
if(dir==)FOR(i,,m)solve(n,i,len,);
else if(dir==)FOR(i,,m)solve(,i,len,);
else if(dir==)FOR(i,,n)solve(i,m,len,);
else if(dir==)FOR(i,,n)solve(i,,len,);
}
// de(dp[4][2]);
printf("%d\n",ans);
return ;
}

单调队列优化dp,k次移动求最长路的更多相关文章

  1. 【单调队列优化dp】uestc 594 我要长高

    http://acm.uestc.edu.cn/#/problem/show/594 [AC] #include<bits/stdc++.h> using namespace std; t ...

  2. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  3. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  4. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  5. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  6. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

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

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

  8. 单调队列优化dp

    洛谷p3800(单调队列优化DP) 题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道 ...

  9. 【单调队列优化dp】HDU 3401 Trade

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...

  10. CF939F Cutlet (单调队列优化DP)

    题目大意:要煎一块有两个面的肉,只能在一段k不相交的时间段$[l_{i},r_{i}]$内翻转,求$2*n$秒后,保证两个面煎的时间一样长时,需要最少的翻转次数,$n<=100000$,$k&l ...

随机推荐

  1. 【php设计模式】适配器模式

    适配器模式(对象适配器.类适配器): 将一个类的接口转换成客户希望的另一个接口.适配器模式让那些接口不兼容的类可以一起工作. 在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的 ...

  2. SpringCloud 随笔

    目录 服务间通讯 统一配置中心 RabbitMQ Spring Cloud Stream 服务网关 Spring Cloud Zuul ++==(纯手打,代码可能有错!)==++ 服务间通讯 Rest ...

  3. 使用Vue CLI脚手架搭建vue项目

    本次是使用@vue/cli 3.11.0版本搭建的vue项目 1. 首先确保自己的电脑上的Node.js的版本是8.9版本或者以上 2. 全局安装vue/cli npm install @vue/cl ...

  4. C++ STL 之 容器的深拷贝和浅拷贝

    如果我们没有提供拷贝构造函数,没有重载=操作符,vector 对我们的 mc 对象进行的简单的浅拷贝,将拷贝的对象插入到容器中,导致我们的 mc 对象的 data 指针和容器中mc 对象的拷贝对象中的 ...

  5. 生成ID之雪花算法

    package com.shopping.test; /** * SnowFlake的结构如下(每部分用-分开):<br> * 0 - 0000000000 0000000000 0000 ...

  6. zip命令分卷压缩和解压缩

    创建分卷压缩文件 zip -s 100m -r folder.zip folder/ -s: 创建分卷的大小 -r: 循环压缩文件夹下面的内容 切分已有的文件: zip existing.zip -- ...

  7. 封装Server类和Client类

    服务器端: EasyTcpServer.hpp #ifndef _EasyTcpServer_hpp_ #define _EasyTcpServer_hpp_ #ifdef _WIN32 #defin ...

  8. 用union 和 struct 位域操作

    很久没有用C 语言中的 union 和 struct 位域操作了. 最近用了一下(当然,我承认是从stackoverflow 上抄的) 需求是这样的,已知一个 LPARAM 整数 3866625 ,求 ...

  9. 【Java 基础实例—Bank 项目1】

    (上图Wie任务要求的UML结构) Account.java 文件: package Banking_1; public class Account { private double balance; ...

  10. 在MyEclipse10中使用Maven

    虽然很多人说maven比起gradle来已经又落后了,但还是有必要了解一下的. 这两天看了好多文章,也跟着做了很多例子,无一例外,创建的pom.xml文件都是有错的.而且由于使用的开发工具不一致,导致 ...