http://www.lydsy.com/JudgeOnline/problem.php?id=3675 (题目链接)

题意

  给出一个包含n个非负整数的序列,要求将其分割成k+1个序列,每次分割可以获得一定的分数,分数=序列分割位置左侧的数之和×序列分割位置右侧的数之和。要求最大分数是多少。

Solution

  稍加分析,发现其实最后得到的分数与分割的先后顺序无关,这个问题卡了我好久,我还是太辣鸡了→_→。发现最后得到的分数=序列1的数字之和×序列2的数字之和×·····×序列k+1的数字之和。

  那么我们可以列出dp方程:${f[x][i]=max(f[x][i],f[x-1][j]+s[j]×(s[i]-s[j]))}$。其中${f[x][i]}$表示将区间${[1,i]}$的序列分割成当${x}$块所得到的最大分数,${s[i]}$表示${1~i}$的前缀和。可是这样的话复杂度就是${O(n*n*k)}$的了,所以我们需要斜率优化。

  最后斜率式长这样:

$${\frac{f[j]-f[k]+s[k]^2-s[j]^2}{s[k]-s[j]}<s[i]}$$

  所以当q[l]与q[l+1]满足上式时,就pop掉q[l]。

细节

  注意f,s数组开long long,斜率的分母${s[k]-s[j]}$可能为0。

代码

// bzoj3675
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483600
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
LL s[maxn],f[2][maxn];
int a[maxn],q[maxn],n,m; double K(int k,int a,int b) {
return s[b]-s[a]==0 ? 0 : (double)(f[k][a]-f[k][b]-s[a]*s[a]+s[b]*s[b])/(double)(s[b]-s[a]);
}
int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
int x=0;
for (int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
for (int k=1;k<=m;k++) {
x^=1;
int l=1,r=1;q[1]=k-1;
for (int i=k;i<=n;i++) {
while (l<r && K(x^1,q[l],q[l+1])<s[i]) l++;
f[x][i]=f[x^1][q[l]]+s[q[l]]*(s[i]-s[q[l]]);
while (l<r && K(x^1,q[r-1],q[r])>K(x^1,q[r],i)) r--;
q[++r]=i;
}
}
printf("%lld",f[x][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. BZOJ3675 Apio2014 序列分割 【斜率优化】

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

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

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

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

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

  8. bzoj3675: [Apio2014]序列分割

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

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

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

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

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

随机推荐

  1. Tstringlist分割字符串的用法?

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaText 2.Delimiter &Delim ...

  2. 产品经理技能之MRD的笔记之一

    原文:http://www.woshipm.com/pmd/131946.html/comment-page-1 产品经理技能之MRD 一.MRD与BRD的不同之处 BRD:这么做有什么好处,并说明好 ...

  3. PHPExcel

    1.PHPExcel类中读取Excel文件相关函数和使用方法 插件官网:http://phpexcel.codeplex.com/ <?php require_once 'Classes/PHP ...

  4. 【Alpha版本】十天冲刺集结令

    031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬涛 [Alp ...

  5. Linux sysinfo获取系统相关信息

    Linux中,可以用sysinfo来获取系统相关信息. #include <stdio.h> #include <stdlib.h> #include <errno.h& ...

  6. hbase-site.xml 配置详解

    hbase.rootdir 这个目录是region server的共享目录,用来持久化HBase.URL需要是'完全正确'的,还要包含文件系统的scheme.例如,要表示hdfs中的'/hbase'目 ...

  7. Tensorflow学习笔记1:Get Started

    关于Tensorflow的基本介绍 Tensorflow是一个基于图的计算系统,其主要应用于机器学习. 从Tensorflow名字的字面意思可以拆分成两部分来理解:Tensor+flow. Tenso ...

  8. sencha xtype清单

    xtype Class ----------------- --------------------- actionsheet Ext.ActionSheet audio Ext.Audio butt ...

  9. jQuery 插件编程精讲与技巧

    适应的读者: 1.有一定的jquery编程基础但是想在技能上有所提升的人 2.前端开发的程序员 3.对编程感兴趣的学生 为什么要学习jquery插件的编写? 为什么要学习jquery插件的编写?相信这 ...

  10. Word Excel 操作总结

    1.与office无关使用 Aspose.Cells.dll,Aspose.Words.dll 2.使用Microsoft.Office.Interop.Excel Microsoft.Office. ...