题链:

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. 1013团队Beta冲刺day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...

  2. ord在python是什么意思?

    >>> help(ord)Help on built-in function ord in module builtins:ord(...) #这是一个函数 ord(c) -> ...

  3. 亚马逊AWS学习——VPC里面几个概念的关系

    VPC中涉及几个概念: VPC 子网 路由表 Internet网关 安全组 今天来讲讲这几个概念之间的关系. 1. VPC 说的就是VPC,当然VPC范围是最大的,VPC即virtual privat ...

  4. C简单实现动态顺序表

    <span style="font-size:18px;">一下为简单实现:</span> #define SIZE 3; typedef int Data ...

  5. 关于mule中使用jdbc时报No Suitable Driver found错误的问题

    错误大概信息: Exception in thread "main" org.mule.module.launcher.DeploymentStartException: SQLE ...

  6. nyoj 还是回文

    还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一个字符, ...

  7. LeetCode & 118-Pascal's Triangle-Easy

    Array Description: Given numRows, generate the first numRows of Pascal's triangle. For example, give ...

  8. Python——cmd调用(os.system阻塞处理)

    os.system(返回值为0,1,2) 0:成功 1:失败 2:错误 os.system默认阻塞当前程序执行,在cmd命令前加入start可不阻塞当前程序执行. 例如: import os os.s ...

  9. maven入门(1-3)构建简单的maven项目

    1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: mvn archetype:generate -DgroupId=com.mycompany.app -Dartifac ...

  10. 前端学习之jquery

    前端学习之jquery 1.   什么是jQuery对象? jQuery对象就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它 ...