3675: [Apio2014]序列切割

Time Limit: 40 Sec  Memory Limit: 128 MB

Submit: 1468  Solved: 607

[Submit][Status][Discuss]

Description

小H近期迷上了一个分隔序列的游戏。在这个游戏里。小H须要将一个长度为n的非负整数序列切割成k+1个非空的子序列。为了得到k+1个子序列,小H须要反复k次下面的步骤:
1.小H首先选择一个长度超过1的序列(一開始小H仅仅有一个长度为n的序列——也就是一開始得到的整个序列)。
2.选择一个位置,并通过这个位置将这个序列切割成连续的两个非空的新序列。
每次进行上述步骤之后。小H将会得到一定的分数。这个分数为两个新序列中元素和的乘积。小H希望选择一种最佳的切割方式。使得k轮之后。小H的总得分最大。

Input

输入第一行包括两个整数n,k(k+1≤n)。

第二行包括n个非负整数a1。a2,...。an(0≤ai≤10^4),表示一開始小H得到的序列。

Output

输出第一行包括一个整数,为小H能够得到的最大分数。

Sample Input

7 3


4 1 3 4 0 2 3

Sample Output

108

HINT

【例子说明】 



在例子中,小H能够通过例如以下3轮操作得到108分: 



1.-開始小H有一个序列(4。1。3。4,0。2,3)。

小H选择在第1个数之后的位置 



将序列分成两部分,并得到4×(1+3+4+0+2+3)=52分。

2.这一轮開始时小H有两个序列:(4),(1。3,4,0。2。3)。

小H选择在第3个数 



字之后的位置将第二个序列分成两部分,并得到(1+3)×(4+0+2+ 



3)=36分。 



3.这一轮開始时小H有三个序列:(4)。(1,3),(4,0。2,3)。小H选择在第5个 



数字之后的位置将第三个序列分成两部分,并得到(4+0)×(2+3)= 



20分。 



经过上述三轮操作,小H将会得到四个子序列:(4),(1,3),(4,0)。(2,3)并总共得到52+36+20=108分。

【数据规模与评分】 



:数据满足2≤n≤100000,1≤k≤min(n -1,200)。

斜率优化DP

这里有一个结论:终于得分是仅仅和分成那些序列有关,和切割的先后顺序无关。

(将式子稍作化简就能够证明)

然后就能够DP了:

f[i][j]表示到第i个数分成j组的最大得分。

则f[i][j]=max{f[k][j-1]+sum[k]*(sum[i]-sum[k])},sum[k]是前缀和。

发现第二维是能够省略的,状态降到一维。节省了空间。

可是时间仍须要优化。考虑斜率优化。单调队列维护下凸包。

详细公式的变换详见笔记本....

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 100005
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,h,t,q[maxn];
ll sum[maxn],f[maxn],g[maxn];
int main()
{
n=read();m=read();
F(i,1,n) sum[i]=sum[i-1]+read();
while (m--)
{
F(i,1,n) g[i]=sum[i]*sum[i]-f[i];
h=1;t=0;
F(i,1,n)
{
while (h<t&&(g[q[t]]-g[q[t-1]])*(sum[i]-sum[q[t]])>=(g[i]-g[q[t]])*(sum[q[t]]-sum[q[t-1]])) t--;
q[++t]=i;
while (h<t&&g[q[h+1]]-g[q[h]]<(sum[q[h+1]]-sum[q[h]])*sum[i]) h++;
f[i]=sum[q[h]]*sum[i]-g[q[h]];
}
}
printf("%lld\n",f[n]);
return 0;
}

bzoj3675【APIO2014】序列切割的更多相关文章

  1. bzoj3675[Apio2014]序列分割 斜率优化dp

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

  2. BZOJ3675 [Apio2014]序列分割 【斜率优化dp】

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 3366  Solved: 1355 [Submit][St ...

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

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

  4. BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8697258.html 题目传送门 - BZOJ3675 题意 对于一个非负整数序列,小H需要重复k次以下的步骤: ...

  5. 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)

    传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...

  6. BZOJ3675 Apio2014 序列分割 【斜率优化】

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

  7. BZOJ3675: [Apio2014]序列分割(斜率优化)

    Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4186  Solved: 1629[Submit][Status][Discuss] Descript ...

  8. bzoj3675: [Apio2014]序列分割

    留坑 为什么别人家的斜率优化跟我一点都不一样! 为什么斜率都要变成正的... 为什么要那么推式子 为什么不能直接做啊..... 为什么不把0去掉去秒WA啊 为什么叉积去了0也过不了啊 woc啊 #in ...

  9. [luogu3648][bzoj3675][APIO2014]序列分割【动态规划+斜率优化】

    题目大意 让你把一个数列分成k+1个部分,使分成乘积分成各个段乘积和最大. 分析 首先肯定是无法开下n \(\times\) n的数组,那么来一个小技巧:因为我们知道k的状态肯定是从k-1的状态转移过 ...

  10. BZOJ 3675 APIO2014 序列切割 斜率优化DP

    题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...

随机推荐

  1. webpack vuejs 和 vue-router 如何使用?

    读本文之前,建议对webpack和vuejs有初步的了解,通过webpack的官网和vuejs的中文官网了解即可 网站主要目录://某些文件不一定全部罗列出来,注意观察 vue-wepack -src ...

  2. Git_远程仓库

    到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了. 可是有用过集中式版本控制系统SVN的童鞋会站出来说,这些功能在SVN里早就有了,没看出Gi ...

  3. iOS学习之WebView的使用 (主要是下面的全屏半透明实现)

    1.使用UIWebView加载网页 运行XCode 4.3,新建一个Single View Application,命名为WebViewDemo. 2.加载WebView 在ViewControlle ...

  4. Java工程师成神之路 转

      一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http:/ ...

  5. mysql-debug

    http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000002778 http://hedengcheng.com/?p=238 h ...

  6. setTimeout(fn, 0) 的作用

    在 zepto 源码中,$.fn 对象 有个 ready 函数,其中有这样一句 setTimeout(fn,0); 1 $.fn = { 2 ready: function(callback){ 3 ...

  7. UI----------------Toggle

    Is On:是否已经勾选上了 Toggle Transition:渐变效果 Graphic:勾选标志的图,就是那个勾 Group:多选组 On Value Changed:当选项改变时,触发事件 多选 ...

  8. java中初始化对象变量的方法

    1.在类定义对象的地方初始化 2.在类构造器中初始化 3.在正要使用这些对象之前,惰性初始化,或者叫惰性载入 4.使用实例初始化    在方法里使用初始化

  9. KStudio window上编译uclinux

     可能没有几个人能像我这样在Windows下编译Linux内核,甚至于同时进行内核调试.这种事情我不是第一个做到的,至少我们公司的原TKStudio部门已经做过.在TKStudio网站上,提供了一个L ...

  10. java、js中实现无限层级的树形结构(类似递归)

    js中: var zNodes=[ {id:0,pId:-1,name:"Aaaa"}, {id:1,pId:0,name:"A"}, {id:11,pId:1 ...