题链:

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)

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #define MAXN 3050
  5. using namespace std;
  6. int DP[2][MAXN],SUM[MAXN];
  7. int N,M,*t1=DP[0],*t2=DP[1];
  8. struct Moque{
  9. int q[MAXN],l,r;
  10. void Reset(){l=r=1; q[1]=0; t2[0]=0;}
  11. double Y(int j){
  12. return t2[j]+1.0*SUM[j]*SUM[j];
  13. }
  14. double X(int j){
  15. return 2.0*SUM[j];
  16. }
  17. double Slope(int j,int k){
  18. return (Y(j)-Y(k))/(X(j)-X(k));
  19. }
  20. void Push(int i){
  21. if(l<=r&&SUM[i]==SUM[q[r]])
  22. {if(t2[i]<t2[q[r]]) r--; else return;}
  23. while(l+1<=r&&Slope(i,q[r])<Slope(q[r],q[r-1])) r--;
  24. q[++r]=i;
  25. }
  26. int Query(int i){
  27. while(l+1<=r&&Slope(q[l],q[l+1])<SUM[i]) l++;
  28. return q[l];
  29. }
  30. }Q;
  31. int main(){
  32. scanf("%d%d",&N,&M);
  33. for(int i=1;i<=N;i++)
  34. scanf("%d",&SUM[i]),SUM[i]+=SUM[i-1];
  35. memset(DP,0x3f,sizeof(DP));
  36. t1[0]=0;
  37. for(int j=1;j<=M;j++){
  38. Q.Reset(); swap(t1,t2);
  39. for(int i=1,k;i<=N;i++){
  40. Q.Push(i); k=Q.Query(i);
  41. t1[i]=t2[k]+(SUM[i]-SUM[k])*(SUM[i]-SUM[k]);
  42. }
  43. }
  44. printf("%d",M*t1[N]-SUM[N]*SUM[N]);
  45. return 0;
  46. }

  

●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. 201621123050 《Java程序设计》第7周学习总结

    1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 1.事件:用户的操作,例如点击或输入之类的操作 2. ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)11.16

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: 整理各自的任务汇报: 全分享遇到的困难一起讨论: 讨论接下来的计划: b. 每个人的工作 (有work item 的ID) 1.前两天 ...

  3. AWS中,如果使用了ELB,出现outofservice

    平台:亚马逊AWS EC2 出现状况: 我创建了弹性平衡负载,也注册了实例,但是实例的状态一直是outofservice.为什么? 为什么会出现这个问题呢? 1:实例有问题: 2:负载平衡器创建的有问 ...

  4. 虚拟机Vmware成功安装Ubuntu Server 16.04中文版

    最近想在Linux下学习Python的爬虫开发技术,经过认真考虑优先选择在在Ubuntu环境下进行学习Python的开发,虽然Ubuntu Server 16.04 LTS版本已经集成了Python ...

  5. 20165226 2017-2018-4 《Java程序设计》第6周学习总结

    20165226 2017-2018-4 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用实用类 string类 并置 两个常量进行并置,得到的仍是常量. public ...

  6. GIT入门笔记(10)- 多种撤销修改场景和对策

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步, ...

  7. 阿里云API网关(7)开发指南-API参考

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  8. OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)

    授权方式3-密码模式(Resource Owner Password Credentials Grant) 密码模式(Resource Owner Password Credentials Grant ...

  9. spring9——AOP之AspectJ对AOP的实现

    从上述的实验中可以看出BeanNameAutoProxyCreator对于AOP的实现已经和完美了,但是还有两点不足之处: 1,对于切面的实现比较麻烦,既不同类型的通知切面要实现不同的接口,而且一个切 ...

  10. python实现归并排序,归并排序的详细分析。

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的 ...