●BZOJ 4518 [Sdoi2016]征途
题链:
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]征途的更多相关文章
- 动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 532 Solved: 337[Submit][Status][ ...
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...
- BZOJ 4518 [Sdoi2016]征途(分治DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4518 [题目大意] 给出一个数列,分成m段,求方差最小,答案乘上m的平方. [题解] ...
- bzoj 4518: [Sdoi2016]征途
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- 4518: [Sdoi2016]征途
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
- BZOJ.4072.[SDOI2016]征途(DP 斜率优化)
题目链接 题目要求使得下面这个式子最小(\(\mu=\frac{\sum_{i=1}^ma_i}{m}\)是平均数,\(a_i\)为第\(i\)段的和): \[\frac{\sum_{i-1}^m(\ ...
- bzoj4518[Sdoi2016]征途 斜率优化dp
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1657 Solved: 915[Submit][Status] ...
- BZOJ_4518_[Sdoi2016]征途_斜率优化
BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...
随机推荐
- backpropagation
github: https://github.com/mattm/simple-neural-network blog: https://mattmazur.com/2015/03/17/a-step ...
- C语言——总结回顾
1.当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 答:①当初选择计算机专业是出于一种选择,是一种带着冲 ...
- python 特殊方法实例
import collections from random import choice card = collections.namedtuple('Card',['rank','suit']) # ...
- Basys3在线调试视频指南及代码
fpga在线调试视频链接 FPGA选择型号:xc7a35tcpg236-1 des文件 `timescale 1ns / 1ps module top( output [1:0] led, outpu ...
- io多路复用(二)
服务端 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() inputs = [sk1,] i ...
- [SDOI2014]旅行
洛谷 P3313 [SDOI2014]旅行 https://www.luogu.org/problem/show?pid=3313 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接 ...
- centos7 编译安装greenplum5.7
一.配置系统 安装是以一个主节点,三个子节点进行安装.gp是在github上下载的5.7的源码.地址https://github.com/greenplum-db/gpdb/tree/5.7.0. 1 ...
- 聊一聊C#的Equals()和GetHashCode()方法
博客创建一年多,还是第一次写博文,有什么不对的地方还请多多指教. 关于这次写的内容可以说是老生长谈,百度一搜一大堆.大神可自行绕路. 最近在看Jeffrey Richter的CLR Via C#,在看 ...
- 获取apk项目的MD5值和SHA1值
一些可说可不说的话: * 以前有一个更简单的方法,在as的右边工具栏的 gradle 面板中可以很方便的获取到: * 上次用也是在2年前,时间长了给忘记了,不过我记得我当时写了笔记,这会笔记不在身边, ...
- copy代码(含static对象)留下的致命错误
本来以为这个bug快改不好了,然而发现了问题所在 copy代码没有完全改掉对象名称,导致对象重复创建了,由于是static所以debug过程中 注释了addProperty(gridRowDetail ...