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. python mac环境搭建

    安装 virtualenv $ sudo pip install virtualenv 然后建立一个测试目录: $ mkdir testvirtual $ cd testvirtual 就可以成功创建 ...

  2. jmeter-分布式部署之负载机的设置

    本文分三个部分: 1.windows下负载机的配置 2.Linux下负载机的配置 3.遇到的问题 *************************************************** ...

  3. ROS知识(14)----局部避障的动态窗口算法(DWA)及其调试的方法

    Dynamic Window Approach(DWA)是重要的局部轨迹规划算法,ROS中使用了DWA算法获得了很好的局部路径规划的效果.具体的教程可参考官方的导航调试资料Navigation Tun ...

  4. centos7安装redis-4.0.1集群

    试验机操作系统:CentOS Linux release 7.2.1511 (Core) 本文的目的是教会大家快速搭建redis集群,完了再深入学习. 试问如果不上手试验,看的资料再多有个毛用? 下载 ...

  5. angularjs中如何在异步请求执行完以后再执行其他函数?

    angularjs中如何在异步请求执行完以后再执行其他函数? 之前脑袋回路就是从上到下的执行js,直到有一次我的页面上已经显示了空才走到angularjs里的$http的成功回调函数里,然后才开始正视 ...

  6. MCP2515 : SPI CAN controller management

    #ifndef __MCP2515_H #define __MCP2515_H /* mcp2515.h This file contains constants that are specific ...

  7. 【windows socket+HTTPserverclient】

    Windows Socket+HTTPserverclient      Winsock是 Windows下套接字标准.                 1.HTTP协议:          HTTP ...

  8. setTimeout(fn, 0) 的作用

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

  9. dwz ajax session超时跳转登录页(struts2自定义拦截器)

    1.定义struts2拦截器(网上例子很多) 代码如下: package rt.intercepter; import java.util.Map; import javax.servlet.http ...

  10. Linux 提权常用命令集

    转载:http://www.myhack58.com/Article/html/3/8/2017/83236.htm 0x00 操作系统相关 操作系统类型版本 cat /etc/issue cat / ...