<更新提示>

<第一次更新>


<正文>

optimization

Description

\(visit\_world\) 发现有些优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:

现在有一个长度为N的整数序列\(\{a_i\}\) ,你需要从中选出K个不相交的连续子区间(可以存在元素不被选),从左到右记它们的和为\(s1,s2,...,sk\)。我们的优化目标是最大化下述和式:

\[\sum_{i=1}^k|s_i−s_{i+1}|
\]

你只需要输出这个最大的和即可.

Input Format

第一行两个整数N,K,意义如上.

接下来一行N个整数,第i个数表示ai,保证有\(|a_i|≤10^4\) .

Output Format

输出一行一个整数,表示答案.

Sample Input

5 3
5 2 4 3 1

Sample Output

12

解析

一道很神奇的\(dp\)。

关于绝对值的最大和,一个小\(trick\)就是拆开绝对值号,对正负两种情况都\(dp\),最后去最大值一定就是最优解。

那么我们发现对于一个\(s_i\),他可能有三种贡献系数:\(2,-2,0\),这与\(s_{i-1},s_{i+1}\)与其的相对大小关系有关,当然,对于\(s_1,s_k\),他们的贡献系数还有可能是\(1,-1\),我们不妨由此设计状态。

设\(f[i][j][0/1/2/3]\)代表前\(i\)个数,分成\(j\)段,当前处于最大值(\(+2\)贡献),最小值(\(-2\)贡献),上升状态(\(0\)贡献),下降状态(\(0\)贡献)的最大和。其中上升状态和下降状态指的就是最大值和最小值前的一些\(0\)贡献的状态。

然后就可以\(dp\)了,时间复杂度是\(O(n^3k)\)的。

考虑优化,第一个就是我们可以强制认为每一个数字都是要取的,当然不取可以放在\(0\)贡献的状态里处理。第二个每一段当中的数字贡献系数的相同的,可以直接一个一个添加数字。

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int N = 3e4+20 , K = 220 , INF = 0x3f3f3f3f;
inline int read(void)
{
int x = 0 , w = 0; char ch = ' ';
while ( !isdigit(ch) ) w |= ch == '-' , ch = getchar();
while ( isdigit(ch) ) x = x * 10 + ch - 48 , ch = getchar();
return w ? -x : x;
}
int n,k,a[N],f[N][K][4];
inline void input(void)
{
n = read() , k = read();
for (int i=1;i<=n;i++)
a[i] = read();
}
inline void dp(void)
{
memset( f , 0xcf , sizeof f );
for (int i=1;i<=n;i++)
f[i][0][0] = f[i][0][1] = f[i][0][2] = f[i][0][3] = 0;
f[0][0][0] = f[0][0][1] = f[0][0][2] = f[0][0][3] = 0;
for (int i=1;i<=n;i++)
for (int j=1;j<=min(i,k);j++)
{
int mul = 2;
if ( j == 1 || j == k ) mul--;
f[i][j][0] = max( f[i-1][j][0] , f[i-1][j-1][2] ) + mul * a[i];
f[i][j][1] = max( f[i-1][j][1] , f[i-1][j-1][3] ) - mul * a[i];
f[i][j][2] = max( f[i-1][j][2] , f[i][j][1] );
f[i][j][3] = max( f[i-1][j][3] , f[i][j][0] );
if ( mul == 1 ) continue;
f[i][j][2] = max( f[i][j][2] , f[i-1][j-1][2] );
f[i][j][3] = max( f[i][j][3] , f[i-1][j-1][3] );
}
}
int main(void)
{
input();
dp();
printf("%d\n",max(f[n][k][2],f[n][k][3]));
return 0;
}

<后记>

『optimization 动态规划』的更多相关文章

  1. 似魔鬼的 『 document.write 』

    在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...

  2. 拾遗:『Linux Capability』

    『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...

  3. 『创意欣赏』20款精致的 iOS7 APP 图标设计

    这篇文章给大家分享20款精致的 iOS7 移动应用程序图标,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣 ...

  4. 『设计前沿』14款精致的国外 iOS7 图标设计示例

    每天都有大量的应用程序发布到 iOS App Store 上,在数量巨大的应用中想要引起用户的主要,首要的就是独特的图标设计.这篇文章收集了14款精致的国外 iOS7 图标设计示例,希望能带给你设计灵 ...

  5. Github 恶搞教程(一起『玩坏』自己的 Github 吧)

    最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...

  6. 『创意欣赏』30幅逼真的 3D 虚拟现实环境呈现

    又到周末了,给大家分享30幅漂亮的 3D 虚拟现实环境呈现,放松一下.这些创造性的场景都是通过 3D 图形设计软件,结合三维现实环境渲染制作出来的.一起欣赏:) 您可能感兴趣的相关文章 20幅温馨浪漫 ...

  7. [TYVJ1827]『Citric II』一道防AK好题

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的 ...

  8. 办理滑铁卢大学(本科)学历认证『微信171922772』UW学位证成绩单使馆认证University of Waterloo

    办理滑铁卢大学(本科)学历认证『微信171922772』UW学位证成绩单使馆认证University of Waterloo QQ/微信171922772办理毕业证成绩单.真实使馆及教育部学历认证★诚 ...

  9. 办理渥太华大学(本科)学历认证『微信171922772』Ottawa U学位证成绩单使馆认证University of Ottawa

    办理渥太华大学(本科)学历认证『微信171922772』Ottawa U学位证成绩单使馆认证University of Ottawa QQ/微信171922772办理毕业证成绩单.真实使馆及教育部学历 ...

随机推荐

  1. git报错 - remote: HTTP Basic: Access denied

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 git 拉取代码报: remote: HTTP Basic: Access denied,这是因为你的GIT密码修改后,需要重新认证授权,那么怎么操 ...

  2. 点击除指定区域外的空白处,隐藏div

    <script> $(document).click(function (e) { var $target = $(e.target); //点击.zanpl和.quanzipl以外的地方 ...

  3. Arduino+esp8266-01+舵机 制作基于局域网的遥控门禁

    这个最终的效果呢,就是可以通过手机连接上esp8266创建的wifi,然后连接其创建的服务器,发送特定指令就可实现遥控开门 (做工比较粗糙还请不要见笑...) 一.原理 其实这个一看就会明白,非常简单 ...

  4. HeadFirst设计模式---观察者

    表达公式 注册者 + 订阅者 = 观察者模式 设计气象站 气象站接口 /** ** 布告板 ** @author lollipop ** @since 2019/11/24 **/ public in ...

  5. jdbc、Mybatis、Hibernate介绍(非原创)

    文章大纲 一.jdbc介绍二.Mybatis介绍三.Hibernate介绍四.jdbc.Mybatis.Hibernate比较五.参考文章   一.jdbc介绍 1. jdbc编程步骤 (1)加载数据 ...

  6. python使用ftplib模块实现FTP文件的上传下载

    python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...

  7. IBM LOTUS DOMINO 9 部署SSL证书

    前言 随着SHA1算法在2016年12月31日以后,将被强制淘汰,所有新的SSL证书都必须支持SHA256算法,所以我们必须将IBM Domino Server升级到9.0以上才可以支持SHA256算 ...

  8. Python环境安装与基础语法(2)——数据类型、标识符、语言分类

    高级语言发展 结构化语言:以顺序(步骤化),分支,循环描述问题 面向对象语言:接近人类的认知,万物抽象成对象,对象间的关系抽象成类和继承 程序=数据结果+算法 Python解释器 CPython:由C ...

  9. 201871010133-赵永军《面向对象程序设计(java)》第七周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...

  10. InfoQ一波文章:菜鸟核心技术/Intel发布CPU新架构3D堆栈法/BDL/PaddlePaddle/百度第三代Spider/Tera

    菜鸟智慧新物流核心技术全解析   孟靖 阅读数:63192018 年 12 月 14 日 16:00   2018 年天猫双 11 全球狂欢节已正式落下帷幕,最终成交额定格在 2135 亿元,物流订单 ...