[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=3675

[算法]

首先 , 我们发现将一段序列切成若干段所获得的收益与顺序无关

于是我们可以用fi,j表示切i次 , 前j个数的最大收益

令sumi表示ai的前缀和

显然 , fi,j = max{ fi-1,k + sumk * (sumj - sumk) }

斜率优化即可

此题内存限制较紧 , 可以使用滚动数组优化空间复杂度

时间复杂度 : O(NK)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define MAXK 210
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull; int n , k , l , r;
ll X[MAXN] , Y[MAXN] , sum[MAXN] , f[][MAXN];
int a[MAXN] , q[MAXN] , last[MAXK][MAXN]; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
int main()
{ read(n); read(k);
for (int i = ; i <= n; i++)
{
read(a[i]);
sum[i] = sum[i - ] + a[i];
}
for (int i = ; i <= k; i++)
{
int now = i & , pre = now ^ ;
f[now][q[l = r = ] = ] = ;
for (int j = ; j <= n; j++)
{
while (l < r && Y[q[l + ]] - Y[q[l]] >= -sum[j] * (X[q[l + ]] - X[q[l]])) ++l;
f[now][j] = Y[q[l]] + X[q[l]] * sum[j];
X[j] = sum[j];
Y[j] = f[pre][j] - sum[j] * sum[j];
last[i][j] = q[l];
while (l < r && (Y[j] - Y[q[r]]) * (X[q[r]] - X[q[r - ]]) >= (Y[q[r]] - Y[q[r - ]]) * (X[j] - X[q[r]])) --r;
q[++r] = j;
}
}
printf("%lld\n" , f[k & ][n]);
int now = n , s = k;
vector< int > ans;
while (now > )
{
now = last[s][now];
if (now) ans.push_back(now);
--s;
}
reverse(ans.begin() , ans.end()); // 输出方案... return ; }

[APIO 2014] 序列分割的更多相关文章

  1. 解题:APIO 2014 序列分割

    题面 拆开式子我们发现切割顺序不影响答案,所以可以设计出一个$dp[i][j]$表示到$i$为止切了$j$刀的最大收益之类的,然后做个前缀和就可以转移了. $dp[i][j]=min(dp[i][j] ...

  2. bzoj 3675: [Apio2014]序列分割

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  3. [Bzoj3675][Apio2014]序列分割(斜率优化)

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4021  Solved: 1569[Submit][Stat ...

  4. 【BZOJ-3675】序列分割 DP + 斜率优化

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1420  Solved: 583[Submit][Statu ...

  5. 【bzoj3675】 Apio2014—序列分割

    http://www.lydsy.com/JudgeOnline/problem.php?id=3675 (题目链接) 题意 给出一个包含n个非负整数的序列,要求将其分割成k+1个序列,每次分割可以获 ...

  6. bzoj 3675 [Apio2014]序列分割(斜率DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3675 [题意] 将n个数的序列分割k次,每次的利益为分割后两部分数值和的积,求最大利益 ...

  7. 【斜率DP】BZOJ 3675:[Apio2014]序列分割

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 427[Submit][Statu ...

  8. 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割

    Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...

  9. BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

随机推荐

  1. 并行程序设计---cuda memory

    CUDA存储器模型: GPU片内:register,shared memory: host 内存: host memory, pinned memory. 板载显存:local memory,cons ...

  2. project管理之makefile与自己主动创建makefile文件过程

    (风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自己主动编译和链接使用的环境 想知道到Linux Makefile系 ...

  3. 关于在 C#中无法静态库引用的解决方法

    在VS中用C#写了个类库,后面想转成静态库发现没有直接的方法,原来在C++中可以,而C#中不支持. 但是有时候程序引用C#编写的动态库觉得用户体验不好太累赘,想要简单只发一个exe可执行程序给用户就好 ...

  4. web前端面试系列 - 算法( 数组去重 )

    1. 思路:设置一个临时数组temp,然后遍历要去重的数组arr,如果arr中的元素能够在temp中找到,则跳过此元素,否则将此元素存入temp,最后返回temp. 实现一 function uniq ...

  5. SGPIO

    http://en.wikipedia.org/wiki/SGPIO SGPIO From Wikipedia, the free encyclopedia   Serial General Purp ...

  6. PHP date()获取系统时间不对

    使用date_default_timezone_set(”)方法; <?php error_reporting(0); date_default_timezone_set('PRC'); hea ...

  7. SAM4E单片机之旅——2、LED闪烁之轮询定时器

    之前我们使用空循环,达到了延迟的目的,但是这样子的延迟比较不精确.现在就使用实时定时器(RTT)来进行更为精确的计时.RTT虽然不是特别通用,在某些单片机上可能没有,但它较为简单. RTT内部有一个计 ...

  8. EasyPusher手机直播图像旋转90度后画面重复的问题

    本文转自:http://blog.csdn.net/holo_easydarwin/article/details/51147379 最初在做EasyPusher手机直播的时候遇到过一个问题:手机竖屏 ...

  9. Chef vs Puppet vs Ansible vs Saltstack: Which Works Best For You?

    Ansible vs SaltStack 谁才是自动化运维好帮手? - CSDN博客 https://blog.csdn.net/a105421548/article/details/53558598 ...

  10. 删除SVN账号

    删除里面的所有文件   C:\Users\Administrator\AppData\Roaming\Subversion\auth