<更新提示>

<第一次更新>


<正文>

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. centos通过yum快速安装JDK1.8

    centos通过yum快速安装JDK1.8检索1.8的列表:yum list java-1.8*安装1.8.0的所有文件:yum install java-1.8.0-openjdk* -y 出现 C ...

  2. Telegram Android源码问题汇总 持续更新

    libtgvoip目录为空 git clone下来的工程中带有submodule时,submodule的内容没有下载下来,执行如下命令 cd Telegram git submodule update ...

  3. Docker下载镜像太慢问题

    我在linux上安装了Docker,docker pull 了一个nginx镜像,真他妈是太慢了用了1-2个小时才下载完成. 在网上找到了优化方法,那真是速度一下就起飞了,其实只要配置一下拉取的doc ...

  4. 软件设计师【软件工程:软件开发模型、XP极限编程十二最佳实践】

    一.软件开发模型 二.XP极限编程十二最佳实践

  5. Spring Cloud Netflix之Euraka Server注册中心

    Spring Cloud简介 Spring Cloud是基于Spring Boot的一套实现微服务架构的生态组件.生态组件中包含Spring Cloud NetFlix,Spring Cloud Fe ...

  6. SQL Server学习内容(一)

    SQL Server SQL Server对大小写不敏感,每条语句末端使用分号. 1.SQL命令 SELECT 从数据中提取数据 UPDATE 更新数据中的数据 DELETE 从数据库中删除数据 IN ...

  7. pytest中怎么引用前置中的变量

    本文主要总结的是pytest中的前置后置怎么返回参数 我们在做自动化的过程中,如果运用的是pytest的话,会遇到怎么使用前置条件中的变量 比如: @pytest.fixture() def init ...

  8. v8/src/compilation-statistics.cc pdfium编译

    v8/src/compilation-statistics.cc:18:3: 警告:‘auto’ changes meaning in C++11; please remove it [-Wc++0x ...

  9. Nginx配置参数中文详细说明

    #定义Nginx运行的用户和用户组user www www;##nginx进程数,建议设置为等于CPU总核心数.worker_processes 8;##全局错误日志定义类型,[ debug | in ...

  10. golang 登录

    用户的两种登录模式 1.LDAP登录 //ldapLogin 通过LDAP登陆 func (m *Member) ldapLogin(account string, password string) ...