5501 环路运输 0x50「动态规划」例题

描述

在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min⁡(|i-j|,N-|i-j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。每座仓库都存有货物,其中编号为 i 的仓库库存量为 A_i。在 i 和 j 两座仓库之间运送货物需要的代价为 A_i+A_j+dist(i,j)。求在哪两座仓库之间运送货物需要的代价最大。1≤N≤10^6,1<=Ai<=10^7。

输入格式

第一行一个整数N,第二行N个整数A1~AN。

输出格式

一个整数,表示最大代价。

样例输入

5
1 8 6 2 5

样例输出

15

题意:

n个仓库环形排列,每个仓库有一个库存量。i和j仓库之间运送货物的代价是Ai + Aj + dist(i, j)。dist(i, j) = min(|i - j|, N - |i - j|)

要求哪两个仓库之间运送货物代价最大。

思路:

在1和n之间把环断开,复制一倍接在末尾。原来环形路上的两个点i和j,如果i - j <= N / 2,那么新的公路上,他们的代价仍然是Ai + Aj + i - j

如果i - j > N / 2, 那么在原来环形路上就要反方向,相当于在新的道路上,i和j+N之间运送货物。代价就是Ai + Aj+n + j + N - i

所以原问题就可以转化为:长度为2N的直线公路上,满足1 <= j < i <= 2N 并且 i - j <= N / 2 的仓库i和j之间运送货物,使得代价 Ai + Aj + i - j最大

我们可以枚举i,找到对应的Aj - j最大的j。

枚举i的过程中如果继续枚举j,显然会超时。可以考虑使用单调队列进行优化。

我们可以比较k和j, k < j < i并且Ak - k < Aj - j , 那么对于所有大于等于i的右端点,k永远不会成为最优选择。因为不但Ak - k较小,而且k离i更远,更容易超过N/2的限制,即j的生存能力比k强。所以j出现之后,k就是一个完全无用的位置。

能够成为最优选择的策略集合一定是一个“下标位置递增,对应的Ai - i也递增”的序列。

那么我们从前向后扫描,对于每个i 执行3 个步骤:

1.判断队头决策与i的距离是否超出N/2的限制,若超出则出队。

2.此时的队头元素就是右端点为i时,左端点j的最优选择。

3.删除队尾决策,队尾对应的Ak - k 小于Ai- i, 把i作为一个新的决策入队。

可以把原来的算法优化至O(n)

 //#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<vector>
#include<map> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL; int n;
const int maxn = 1e6 + ;
int a[maxn * ], q[maxn * ]; int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
}
for(int i = n + ; i <= * n; i++){
a[i] = a[i - n];
} //memset(dp, 0, sizeof(dp));
int l = , r = , ans = ;
q[] = ;
for(int i = ; i <= * n; i++){
while(l <= r && q[l] < i - n / )l++;
ans = max(ans, a[i] + a[q[l]] + i - q[l]);
while(l < r && a[i] - i >= a[q[r]] - q[r]) r--;
q[++r] = i;
} printf("%d\n", ans);
return ;
}

5501环路运输【(环结构)线性DP】【队列优化】的更多相关文章

  1. [bzoj1044][HAOI2008][木棍分割] (二分+贪心+dp+队列优化)

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  2. [luogu1772 ZJOI2006] 物流运输 (最短路 线性dp)

    题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...

  3. Bellman-Ford算法及其队列优化(SPFA)

    一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...

  4. poj2228 Naptime【(环结构)线性DP】

    Naptime Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:3374   Accepted: 1281 Descriptio ...

  5. 单调队列+线性dp题Watching Fireworks is Fun (CF372C)

    一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...

  6. 【NOIP2017】跳房子 题解(单调队列优化线性DP)

    前言:把鸽了1个月的博客补上 ----------------- 题目链接 题目大意:机器人的灵敏性为$d$.每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),m ...

  7. [DP浅析]线性DP初步 - 2 - 单调队列优化

    目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Littl ...

  8. P3387缩点(tarjan+拓扑排序+线性dp)

    题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...

  9. 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)

    这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...

随机推荐

  1. GameObject非激活状态,触发测试

    测试结果为OnEnable,Start不执行.Awake不管激活未激活都执行 不管是驻留在层级面板,还是手动拖上去. 但是,在任何时间设为激活.就会2个都触发.Awake和Start只触发一次.这个问 ...

  2. Atitit. 软件---多媒体区---- jmf 2.1.1 Java Media Framework 支持的格式

    Atitit. 软件---多媒体区---- jmf 2.1.1 Java Media Framework 支持的格式 JMF,全名为Java Media Framework,它可以在java appl ...

  3. cygwin 运行java的一些记录

    javac编译没问题,但是java执行就不行,处理方式如下 其实就是把宿主机下的java.exe在cygwin下搞一个快捷方式 关于路径问题,可以使用cygpath命令进行宿主机和cygwin间的转换 ...

  4. Struts2源码阅读(一)_Struts2框架流程概述

    1. Struts2架构图  当外部的httpservletrequest到来时 ,初始到了servlet容器(所以虽然Servlet和Action是解耦合的,但是Action依旧能够通过httpse ...

  5. tornado异步web请求

    1.为什么要使用异步web服务使用异步非阻塞请求,并发处理更高效. 2.同步与异步请求比较同步请求时,web服务器进程是阻塞的,也就是说当一个请求被处理时,服务器进程会被挂起直至请求完成. 异步请求时 ...

  6. cocos2dx中CCTableView乱位问题歪解

    可能是引擎作者没有考虑到CCTableView里cell还会改变的需求,结果改变了 cell后其它的cell也跟着改变了.于是在网上查了一下,发现没有人遇到我的 问题,看来我总是遇到奇葩问题,不过也找 ...

  7. DIV中display和visibility属性差别

    DIV中display和visibility属性差别 DIV中display和visibility属性差别还是挺大的,虽然Visibility和Display属性都可以达到隐藏页面元素的目的,但它们的 ...

  8. Github优秀开源项目

    王潜升 https://github.com/code4craft/webmagic 一个爬虫框架,除了不会反爬虫外(当然可以自己加)其他都很牛逼.这个项目更新还是很快的.   ansi分词  htt ...

  9. Redis 响应延迟问题排查

    计算延迟时间 如果你正在经历响应延迟问题,你或许能够根据应用程序的具体情况算出它的延迟响应时间,或者你的延迟问题非常明显,宏观看来,一目了然.不管怎样吧,用redis-cli可以算出一台Redis 服 ...

  10. 在后台运行Python脚本服务

    在服务器,程序都是后台运行的,当写的python脚本时,需要:   你要是想python robot.py & 是不行的,一旦用户登出,脚本就自动退出了.用at, cron也可以实现不过我发现 ...