洛谷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. bootstrap-selectpicker 插件事件

    $('#id').on('show.bs.select', function (e) { //绑定下拉显示列表触发事件 }); $('#id').on('hidden.bs.select', func ...

  2. wepy2创建项目

    1.首先 在桌面(自己选定目录下)新建一个文件夹,注意需要使用英文名. 2.Cmd中  进入到该文件目录下 3.安装 wepy 命令行工具. npm install wepy-cli -g wepy ...

  3. MUI 支付案例(支付宝/微信)

    首先说明一下,本文借鉴了多位博主的文章,所以会看到很多一样的代码. 写这篇博客主要目的是为了便于后期查看(不好之处,敬请留言吐槽),案例经本人测试,是可以使用的. 先上效果图 前端HTML代码: &l ...

  4. 【坑】Mybatis原始获取配置方式,获取配置失败

    错误环境: mysql版本:6.0.6 mybatis 3.4.1 idea 2017.1.2 maven 3.5.0 错误描述: 配置经路径见图1,classpath是java文件夹 获取配置的代码 ...

  5. Python3 GUI:PyQt5环境搭建

    配置镜像源 最近用Python内置的Thinter写了个小工具,发现界面略朴素,于是决定转向PyQt5.先配置镜像源,否则只能龟速下载. C:\Users\你的用户名下新建目录pip 在pip目录下新 ...

  6. go语言字符串函数小结

    拼接字符串 func Join(a []string, sep string) string, 拼接字符串,将一个[]string的切片通过分隔符,拼接成一个字符串,类似于PHP的implode() ...

  7. Vue介绍:vue导读2

    一.实例中的成员 二.高级指令 三.组件初识 一.实例中的成员 # 计算computed <!DOCTYPE html> <html> <head> <met ...

  8. Django 权限控制配置步骤

    1.models下面添加权限控制信息: class UserProfile(models.Model): user = models.OneToOneField(User) name = models ...

  9. Thinkphp3.2.3关于开启DEBUG正常,关闭DEBUG就报错模版无法找到,页面错误!请稍后再试~

    这是Thinkphp3.2.3的一个坑- 具体原因也没搞清楚,测试环境都是好的,线上就出问题,是因为线上debug是关闭的 具体原委特此记录: 现象:(打开DEBUG就正常了,所以界面看不到具体报错滴 ...

  10. python_tkinter组件摆放方式

    1.最小界面组成 # 导入tkinter模块 import tkinter # 创建主窗口对象 root = tkinter.Tk() # 设置窗口大小(最小值:像素) root.minsize(30 ...