传送门

把式子展开后发现就是要求:

m∗(∑i=1msum′[i])−sum[n]2" role="presentation" style="position: relative;">m∗(∑mi=1sum′[i])−sum[n]2m∗(∑i=1msum′[i])−sum[n]2的最小值。

于是只需要求:

m∗(∑i=1msum′[i])" role="presentation" style="position: relative;">m∗(∑mi=1sum′[i])m∗(∑i=1msum′[i])的最小值。

于是设f[i][j]" role="presentation" style="position: relative;">f[i][j]f[i][j]表示前i个分了j组的最小值。

显然有:

f[i][j]=min(f[k][j−1]+(sum[i]−sum[k])2)" role="presentation" style="position: relative;">f[i][j]=min(f[k][j−1]+(sum[i]−sum[k])2)f[i][j]=min(f[k][j−1]+(sum[i]−sum[k])2)

<=>

f[i][j]=min(f[k][j−1]+sum[k]2−2sum[i]∗sum[k])+sum[i]2" role="presentation" style="position: relative;">f[i][j]=min(f[k][j−1]+sum[k]2−2sum[i]∗sum[k])+sum[i]2f[i][j]=min(f[k][j−1]+sum[k]2−2sum[i]∗sum[k])+sum[i]2

对于两个决策k1&lt;k2" role="presentation" style="position: relative;">k1<k2k1<k2且k2比k1更优,有:

f[k1][j−1]+sum[k1]2−2sum[i]∗sum[k1]" role="presentation" style="position: relative;">f[k1][j−1]+sum[k1]2−2sum[i]∗sum[k1]f[k1][j−1]+sum[k1]2−2sum[i]∗sum[k1]

>

f[k2][j−1]+sum[k2]2−2sum[i]∗sum[k2]" role="presentation" style="position: relative;">f[k2][j−1]+sum[k2]2−2sum[i]∗sum[k2]f[k2][j−1]+sum[k2]2−2sum[i]∗sum[k2]

令t[k]=f[k][j−1]+sum[k]2" role="presentation" style="position: relative;">t[k]=f[k][j−1]+sum[k]2t[k]=f[k][j−1]+sum[k]2

=>

(t[k1]−t[k2])/(sum[k1]−sum[k2])&lt;2sum[i]" role="presentation" style="position: relative;">(t[k1]−t[k2])/(sum[k1]−sum[k2])<2sum[i](t[k1]−t[k2])/(sum[k1]−sum[k2])<2sum[i]

果断斜率优化。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 3005
using namespace std;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,m,hd,tl,q[N];
ll sum[N],f[N][N];
inline double slope(int k,int i,int j){return 1.0*(f[i][k]+sum[i]*sum[i]-f[j][k]-sum[j]*sum[j])/(sum[i]-sum[j]);}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;++i)sum[i]=sum[i-1]+read(),f[i][0]=1e18;
    for(int j=1;j<=m;++j){
        hd=tl=1,q[1]=0;
        for(int i=1;i<=n;++i){
            while(hd<tl&&slope(j-1,q[hd+1],q[hd])<2.0*sum[i])++hd;
            int k=q[hd];
            f[i][j]=f[k][j-1]+(sum[i]-sum[k])*(sum[i]-sum[k]);
            while(hd<tl&&slope(j-1,q[tl],q[tl-1])>slope(j-1,i,q[tl]))--tl;
            q[++tl]=i;
        }
    }
    cout<<(m*f[n][m]-sum[n]*sum[n]);
    return 0;
}

2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)的更多相关文章

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

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

  2. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

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

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

  4. 2018.09.05 任务安排(斜率优化dp)

    描述 这道题目说的是,给出了n项必须按照顺序完成的任务,每项任务有它需要占用机器的时间和价值.现在我们有一台机器可以使用,它每次可以完成一批任务,完成这批任务所需的时间为一个启动机器的时间S加上所有任 ...

  5. 【bzoj4518】[Sdoi2016]征途 斜率优化dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界 ...

  6. [bzoj4518][Sdoi2016]征途-斜率优化

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

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

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

  8. [SDOI2016]征途 —— 斜率优化DP

    时隔多年没有碰斜率优化了... 想当年被斜率优化虐的死去活来,现在看看...也就那样吧. Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计 ...

  9. 2018.09.29 bzoj3156: 防御准备(斜率优化dp)

    传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[i ...

随机推荐

  1. leetcode349

    public class Solution { public int[] Intersection(int[] nums1, int[] nums2) { var list1 = nums1.ToLi ...

  2. FMX TListView 搜索 Search

    FMX,FireMonkey,平台框架下TListView控件搜索.过滤. 查找功能确实强大!! 设置SearchVisibe属性为true,就自动显示搜索框,输入文字,就开始检索了,不用写一行代码! ...

  3. Simple2D-18(音乐播放器)使用 bass 音频库

    BASS 简介 BASS是一个在多个平台上用于软件的音频库.其目的是为开发人员提供功能强大且高效的示例流(MP3,MP2,MP1,OGG,WAV,AIFF),MOD 音乐(XM,IT,S3M,MOD ...

  4. TEXT 3 Food firms and fat-fighters

    TEXT 3 Food firms and fat-fighters 食品公司与减肥斗士 Feb 9th 2006 From The Economist Global Agenda Five lead ...

  5. do{}while() ;异常语句

    //while (true) //只要括号里面是true(正确的如:(1==1)),就会无限循环 //{ //} //do{}while() //不管while满足与否,首先先做一遍 //然后去看wh ...

  6. 安装Anaconda以及jupyter的使用

    1)下载https://www.anaconda.com/download/ 2)安装 3)终端查看(Anaconda Prompt) 4)升级所有的包 初次安装下的软件包版本一般都比较老旧,因此提前 ...

  7. zookeeper集群搭建 windows

    本次zk测试部署版本为3.4.6版本,下载地址http://mirrors.cnnic.cn/apache/zookeeper/ 限于服务器个数有限本次测试了两种情况 1.单节点方式:部署在一台服务器 ...

  8. MySql ERROR 1045 (28000): Access denied 错误

    [MySql ERROR 1045 (28000): Access denied 错误] 即登陆错误,使用MySql登陆时,需使正确的username/passwd.通过 -u -p 参数即可. My ...

  9. Web标准:五、超链接伪类

    Web标准:五.超链接伪类 知识点: 1.链接的四种样式 2.将链接转换为块状 3.用css制作按钮 4.首字下沉   1)链接的四种样式 超链接有四个伪类,分别是: a:link 未访问的链接 a: ...

  10. Animation.wrapMode循环模式

    WrapMode.Default:从动画剪辑中读取循环模式(默认是Once). WrapMode.Once:当时间播放到末尾的时候停止动画的播放. WrapMode.Loop:当时间播放到末尾的时候重 ...