<更新提示>

<第一次更新>


<正文>

数组的最大代价(51nod 1270)

Description

数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。数组A的代价定义如下:

\[S=\sum_{i=2}^{N}|A_i-A_{i-1}|
\]

(公式表示所有两个相邻元素的差的绝对值之和)

给出数组B,计算可能的最大代价S。

Input Format

第1行:1个数N,表示数组的长度(1 <= N <= 50000)。

第2 - N+1行:每行1个数,对应数组元素Bi(1 <= Bi <= 10000)。

Output Format

输出最大代价S。

Sample Input

5
10
1
10
1
10

Sample Output

36

解析

化简题目大意可以得知:即求一个数组限制下的相邻两项最大差值和。

有一个很简单的暴力DP思路如下:

设\(f[i][j]\)代表前\(i\)项当中,第\(i\)个数字取\(j\)的最大和。

\(f[i][j]=max\{f[i-1][k]+|j-k|\}\)

\((i=1 - n,j=1 - B_i,k=1 - B_{i-1})\)

时间复杂度\(O(nMax\{b_i\}^2)\)

不怕暴力TLE,就怕暴力不敢想。没错,最简单的暴力就是这道题的关键。

我们可以用贪心对这个暴力进行降维打击优化。

最显然的贪心,构造\(A_i\)时极端化能得到全局最优解。即:\(A_i\)的最优取值方案只有两种可能,\(1\)或\(B_i\),这样可以让相邻两项的差的绝对值尽可能大。

那么\(j\),\(k\)都只能取最大值或\(1\),直接实现\(O(1)\)转移。可以优化一下状态:设\(f[i][0/1]\)代表前\(i\)项当中,第\(i\)个数字取\(1\)(第二维为0)或\(B_i\)(第二维为1)的最大和。

状态转移方程:

\[f[i][0]=max(f[i-1][0],f[i-1][1]+|B_{i-1}-1|)\\f[i][1]=max(f[i-1][0]+|B_i-1|,f[i-1][1]+|B_i-B_{i-1}|)
\]

可以滚动数组一下把第一维的空间也优化了。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
inline void read(int &k)
{
int w=0,x=0;char ch;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
k=(w?-x:x);return;
}
const int N=50000+80;
int n,b[N],f[2][2];
inline void input(void)
{
read(n);
for(int i=1;i<=n;i++)read(b[i]);
}
inline void dp(void)
{
f[1][0]=f[1][1]=0;
for(int i=2;i<=n;i++)
{
f[i&1][0]=max(f[i-1&1][0],f[i-1&1][1]+abs(b[i-1]-1));
f[i&1][1]=max(f[i-1&1][0]+abs(b[i]-1),f[i-1&1][1]+abs(b[i]-b[i-1]));
}
}
int main(void)
{
input();
dp();
printf("%d\n",max(f[n&1][0],f[n&1][1]));
}

考点:算法思想的结合运用。


<后记>

『数组的最大代价 贪心优化DP』的更多相关文章

  1. 『土地征用 Land Acquisition 斜率优化DP』

    斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer Jo ...

  2. 【贪心优化dp决策】bzoj1571: [Usaco2009 Open]滑雪课Ski

    还有贪心优化dp决策的操作…… Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里 ...

  3. 51nod1270 数组的最大代价(简单dp)

    ---恢复内容开始--- 1270 数组的最大代价 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 数组A包含N个 ...

  4. 『玩具装箱TOY 斜率优化DP』

    玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...

  5. CodeForces - 459E Pashmak and Graph[贪心优化dp]

    E. Pashmak and Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. 完全背包问题 —— 贪心优化 DP 范围

    题意: 现在有 \(2n+1\) 个物品(\(n\le 300\)),体积分别为 \(-n,-n+1,\dots,-1,0,1,\dots,n\),第 \(i\) 个物品有 \(a_i\) 个,求选出 ...

  7. 『数 变进制状压dp』

    数 Description 给定正整数n,m,问有多少个正整数满足: (1) 不含前导0: (2) 是m的倍数: (3) 可以通过重排列各个数位得到n. \(n\leq10^{20},m\leq100 ...

  8. 『摆渡车 斜率优化dp及总结』

    摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...

  9. HDU 5542 - The Battle of Chibi - [离散化+树状数组优化DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5542 Problem DescriptionCao Cao made up a big army an ...

随机推荐

  1. 使用Tornado异步接入第三方(支付宝)支付

    目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支 ...

  2. SQL Server Agent Job 中用Powershell将备份文件拷贝到AWS S3

    SQL Server 数据库备份后,如何再复制一份到AWS S3 上,步骤和需要注意的地方如下: 1. 首先在SQL Server 中创建一个Credential 2. 授权这个Credential ...

  3. Python3-大魔王小项目-田忌赛马

    本人今天第一次接触项目,花了4小时,不包括学习时间,特此留个纪念 记录一下那些年走过的坑,以资鼓励 英语不怎么好,随缘看看 内容: 类似田忌赛马,三盘两胜,属性人物在一定范围内随机,就这样了 code ...

  4. ZOJ4043 : Virtual Singers

    将所有$A$和$B$混在一起排序,那么每个$B$要匹配一个$A$,从左往右依次考虑每个数: 如果是一个$B$: 如果左边没有多余的$A$,那么将其放入堆$q_C$中,表示这个$B$还未匹配. 否则选择 ...

  5. 我们来谈谈最近最热门的微信小程序

    最近微信小程序真是火到不行,我们的经理大人也就此给我做了一定的培训.他讲的太好,我实在忍不住跟大家简单分享一下: 1.什么是微信小程序? 一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦 ...

  6. python学习:字典

    字典 1.查询内存地址 a = 10 print(id(a)) b = a print(id(b)) b = 15 print(id(b)) 2. 数据类型 不可变类型:整型.字符串.元组 可变类型: ...

  7. Oracle (分类、数据库类型、序列)

    分类: 1.DDL (定义语句) create  .alter .drop 不需要commit create table aaa( tt1 varchart ) 2. DML (操纵语句) lnset ...

  8. 201771010118 马昕璐《面向对象程序设计java》第十二周学习总结

    第一部分:理论知识学习部分 用户界面:用户与计算机系统(各种程序)交互的接口 图形用户界面:以图形方式呈现的用户界面 AET:Java 的抽象窗口工具箱包含在java.awt包中,它提供了许多用来设计 ...

  9. Update API

    Update API可以根据提供的脚本更新文档. 该操作从索引获取文档,运行脚本(脚本语言和参数是可选的),并返回操作的结果(也允许删除或忽略该操作). 使用版本控制来确保在“get”(查询文档)和“ ...

  10. VIM批量缩进

    方法一 1.按 ctrl + shif + ;  进入底行模式 2.将所要批量缩进的行号写上,按照格式:“行号1,行号2>”输入命令,如要将4至11行批量缩进一个tab值,则命令为“4,11&g ...