传送门

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

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. ServiceLoader实现原理

    在java中根据一个子类获取其父类或接口信息非常方便,但是根据一个接口获取该接口的所有实现类却没那么容易. 有一种比较笨的办法就是扫描classpath所有的class与jar包中的class,然后用 ...

  2. TEXT 4 A question of standards

    TEXT 4 A question of standards 一个关乎标准的问题 Feb 9th 2006 From The Economist Global Agenda More suggesti ...

  3. Java 枚举那点事

    目录 最近有需求,想存自定义的枚举值,比如 HOTLINE("Hotline") 我想存 Hotline 于是研究了一下Java的枚举问题 如下数据库的Entity (贫血模型哈) ...

  4. 文件和Variant的转换

    function FileToVariant(FileName: String): OleVariant; var   AStream: TFileStream;   MyBuffer: Pointe ...

  5. Openning SharePoint - 80 website gives HTTP 404 Error, The webpage cannot be found ! on SharePoint 2013

    ask: I tried to open the SharePoint - 80 throw Browse in IIS, but I get HTTP 404 Error (The webpage ...

  6. PCA和SVD(转)

    最近突然看到一个问题,PCA和SVD有什么关系?隐约记得自己照猫画虎实现的时候PCA的时候明明用到了SVD啊,但SVD(奇异值分解)和PCA的(特征值分解)貌似差得相当远,由此钻下去搜集了一些资料,把 ...

  7. Electron Browser加载iframe(webview src属性)

    browser或者webcontents 的高度与宽度比例对webview中src的页面结构也是有一定影响的

  8. Java8 Map的遍历方式

    在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map< ...

  9. js input监听兼容事件

    $('#phoneNumber').on('input',function() { var valueP = $(this).attr('value'); if(valueP.length == 11 ...

  10. 旋转链表(所有元素往右移) rotate list

    [抄题]: 给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数 样例 给出链表1->2->3->4->5->null和k=2 返回4->5-& ...