题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=4518

题解:

斜率优化DP

首先看看最后答案的形式:

设a[i]为第i天走的距离,那么

$ANS=\frac{\sum_{i=1}^{M}(a[i]-\overline{x})^2}{M}\times{M^2}$

$\;\qquad=\frac{(\sum_{i=1}^{M}a[i]^2)-2\overline{x}SUM+M\overline{x}^2}{M}\times{M^2}$

$\;\qquad=M(\sum_{i=1}^{M}a[i]^2)-SUM^2$

由于M和SUM是固定的,所以问题转化为求$\sum_{i=1}^{M}a[i]^2$的最小值,

即把区间分为M段,使得每一段的和的平方加起来最小。

定义 DP[i][j] 为前i个位置,分为了j段,且i位置为最后一段的结尾的最小值。

转移:

$DP[i][j]\,=\,min(DP[k][j-1]+(SUM[i]-SUM[k])^2)$

然后把式子展开,得到:

$DP[i][j]\,=\,min(DP[k][j-1]+SUM[k]^2-2SUM[i]SUM[k]+SUM[i]^2)$

是一个典型的可以用斜率优化的式子。

(由于DP时是先枚举第二维,一层一层地计算,所以以下的内容中省略掉dp的第二维,同时用g[i]表示上一层的dp[i][~])

令$Y[j]=g[j]+SUM[j]^2$,

若对于当前计算的dp[i],存在两个转移来源点 k,j,k < j,且j优于k

则得到

$Y[j]-2SUM[i]SUM[j]-Y[k]-2SUM[i]SUM[k]<0$

化简:$\frac{Y[j]-Y[k]}{2SUM[j]-2SUM[k]}<SUM[i]$

令Slope(j,k)=$\frac{Y[j]-Y[k]}{2SUM[j]-2SUM[k]}$,

则得到结论:若k < j,且Slope(j,k)<SUM[i],则j优于k。

那么如果存在 k<j<i,且Slope(i,j)<Slope(j,k),则j是无效点,舍去。

同时注意到SUM[i]单增,所以可以用单调队列维护。

最终的复杂度 O(N*M)

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 3050
using namespace std;
int DP[2][MAXN],SUM[MAXN];
int N,M,*t1=DP[0],*t2=DP[1];
struct Moque{
int q[MAXN],l,r;
void Reset(){l=r=1; q[1]=0; t2[0]=0;}
double Y(int j){
return t2[j]+1.0*SUM[j]*SUM[j];
}
double X(int j){
return 2.0*SUM[j];
}
double Slope(int j,int k){
return (Y(j)-Y(k))/(X(j)-X(k));
}
void Push(int i){
if(l<=r&&SUM[i]==SUM[q[r]])
{if(t2[i]<t2[q[r]]) r--; else return;}
while(l+1<=r&&Slope(i,q[r])<Slope(q[r],q[r-1])) r--;
q[++r]=i;
}
int Query(int i){
while(l+1<=r&&Slope(q[l],q[l+1])<SUM[i]) l++;
return q[l];
}
}Q;
int main(){
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
scanf("%d",&SUM[i]),SUM[i]+=SUM[i-1];
memset(DP,0x3f,sizeof(DP));
t1[0]=0;
for(int j=1;j<=M;j++){
Q.Reset(); swap(t1,t2);
for(int i=1,k;i<=N;i++){
Q.Push(i); k=Q.Query(i);
t1[i]=t2[k]+(SUM[i]-SUM[k])*(SUM[i]-SUM[k]);
}
}
printf("%d",M*t1[N]-SUM[N]*SUM[N]);
return 0;
}

  

●BZOJ 4518 [Sdoi2016]征途的更多相关文章

  1. 动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 532  Solved: 337[Submit][Status][ ...

  2. BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]

    4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...

  3. BZOJ 4518 [Sdoi2016]征途(分治DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4518 [题目大意] 给出一个数列,分成m段,求方差最小,答案乘上m的平方. [题解] ...

  4. bzoj 4518: [Sdoi2016]征途

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  5. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  6. 4518: [Sdoi2016]征途

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  7. BZOJ.4072.[SDOI2016]征途(DP 斜率优化)

    题目链接 题目要求使得下面这个式子最小(\(\mu=\frac{\sum_{i=1}^ma_i}{m}\)是平均数,\(a_i\)为第\(i\)段的和): \[\frac{\sum_{i-1}^m(\ ...

  8. bzoj4518[Sdoi2016]征途 斜率优化dp

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status] ...

  9. BZOJ_4518_[Sdoi2016]征途_斜率优化

    BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...

随机推荐

  1. 学号:201621123032 《Java程序设计》第4周学习总结

    1:本周学习总结 1. 写出你认为本周学习中比较重要的知识点关键词 继承,多态,父类object,抽象类 2. 尝试使用思维导图将这些关键词组织起来 2:书面作业 2.1: 面向对象设计 1. 讲故事 ...

  2. The method getTextContent() is undefined for the type Node

    eclipse 中 如果加入了 其他了xfire 等其他xml解析包的话,使用org.w3c.dom.Node下的getTextContent()方法会出现The method getTextCont ...

  3. python之路--day6--字符编码

    一.知识储备 cpu--控制和运算 内存--暂时存储cpu需要的数据 硬盘--永久保存数据2.文本编辑器的原理存储原理 1,启动文本编辑器 2,在编辑器上输入内容---此时输入内容还在内存上 3,保存 ...

  4. python全栈开发-json和pickle模块(数据的序列化)

    一.什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flat ...

  5. 第四章 JavaScript操作DOM对象

    第四章   JavaScript操作DOM对象 一.DOM操作 DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API接口,1988年,W3C发布了第一级 ...

  6. 在ABPZERO中,扩展实体的方法。

    内容 介绍 扩展的抽象实体 将新属性添加给用户 添加迁移 在界面上显示地址 在用户编辑/添加功能中添加地址 扩展的非抽象类实体 获得版本的派生实体 添加迁移 在界面上添加价格 在创建/编辑版本功能中加 ...

  7. 云+社区技术沙龙:Kafka meetup 深圳站报名开启

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 如果说 2018 年是技术大爆炸年,那么 Apache Kafka 绝对是其中闪亮的新星. 自Kafka 从首发之日起,已经走过了快八个年头 ...

  8. oracle获取表字段属性

    select b.COMMENTS,a.COLUMN_NAME,a.DATA_TYPE,a.DATA_LENGTH, a.DATA_PRECISION,a.DATA_SCALE,a.NULLABLE, ...

  9. 文本编辑器(KindEditord)

    1.下载 官网下载:http://kindeditor.net/down.php 本地下载:http://files.cnblogs.com/files/wupeiqi/kindeditor_a5.z ...

  10. Codeforces Round #436 (Div. 2) D. Make a Permutation!

    http://codeforces.com/contest/864/problem/D 题意: 给出n和n个数(ai <= n),要求改变其中某些数,使得这n个数为1到n的一个排列,首先保证修改 ...