传送门

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

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. 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

    一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...

  2. J2SE 8的泛型

    泛型的简单使用 1. 泛型一般用E表示集合中元素;k和v表示Map中的key和value;R表示return值;T/U/S表示任意类型 //(1) 简单单个元素的泛型 Box<String> ...

  3. 迭代器iter()

    from collections import Iterable print(isinstance({},iterable)) # 判断是否可迭代 from collections import It ...

  4. python 1 面向对象基础知识

    1.编码范式 编程  是程序员用特定的 语法+数据结构+算法 组成的代码来告诉计算机如何执行任务的过程 如果把编程比作习武,编程方式就是武林中的各种流派,而在编程的世界里面最常见的两大流派是:面向过程 ...

  5. ABAP-动态编程

    转载:http://www.cnblogs.com/jiangzhengjun/p/4293407.html 动态编程 动态的基本语法 多种不同的动态编程 动态字段 动态类型 指定结构.内表组件字段的 ...

  6. <U+FEFF> character showing up in files. How to remove them?

    You can easily remove them using vim, here are the steps: 1) In your terminal, open the file using v ...

  7. UEFI BIOS和普通BIOS的区别

    作为传统BIOS(Basic Input/Output System)的继任者,UEFI拥有前辈所不具备的诸多功能,比如图形化界面.多种多样的操作方式.允许植入硬件驱动等等.这些特性让UEFI相比于传 ...

  8. Haskell语言学习笔记(54)Data.Set

    Data.Set Prelude> import Data.Set as Set Prelude Set> :set -XOverloadedLists Construction Prel ...

  9. pycharm 远程开发

    1. 服务器安装图形化 和 pycharm 本地使用 MobaXterm 工具登陆 session配置 勾选 x11-forwarding 运行pycharm.sh 2. 本地pycharm 远程服务 ...

  10. cmd命令 从C盘转到D盘

        点开始 点运行.输入 CMD 回车.进入DOS提示符状态下.输入 cd\ 回车 表示进入 c:\> 也就是C盘根目录下.输入d: 回车 是进入D盘当前目录,并不一定是根目录.然后cd\ ...