原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html


题目描述

Pine开始了从S地到T地的征途。
从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。
Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助Pine求出最小方差是多少。
设方差是v,可以证明,v×m^2是一个整数。为了避免精度误差,输出结果时输出v×m^2。

输入

第一行两个数 n、m。
第二行 n 个数,表示 n 段路的长度

输出

一个数,最小方差乘以 m^2 后的值

样例输入

5 2
1 2 5 8 6

样例输出

36


题解

斜率优化(不需要二维)

所以只要维护∑m*x[i^2-2*sum*x[i]的最小值即可。

设f[i][j]为前i条路分为j段的∑最小值,那么显然有f[i][j]=f[k][j-1]+m*(sum[i]-sum[k])*(sum[i]-sum[k])-2*sum[n]*(sum[i]-sum[k])。

这样dp时间复杂度为O(n^2*m),会TLE,需要优化。

将上述dp方程平方展开并移项,得到f[k][j-1]+m*sum[j]^2+2*sum[n]*sum[j]=2*m*sum[i]*sum[j]+f[i][j]-m*sum[i]^2+2*sum[n]*sum[i]

这样可以用斜率优化来优化。

由于第二维j的存在,需要先循环第二维j,再循环第一维i,并将每次的f[i][j-1]与队列中元素比较并插入。

代码中可以看到我开了滚动数组,但好像没什么必要,直接开二维就行。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 3010
#define y(i , p) (f[i][p] + m * sum[i] * sum[i] + 2 * sum[n] * sum[i])
using namespace std;
typedef long long ll;
int q[N];
ll a[N] , sum[N] , f[N][2];
int main()
{
int n , m , i , j , l , r , d;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) scanf("%lld" , &a[i]) , sum[i] = sum[i - 1] + a[i];
for(i = 1 ; i <= n ; i ++ ) f[i][1] = m * sum[i] * sum[i] - 2 * sum[n] * sum[i];
for(i = 2 ; i <= m ; i ++ )
{
l = r = 0 , d = i & 1;
for(j = 1 ; j <= n ; j ++ )
{
while(l < r && y(q[l + 1] , d ^ 1) - y(q[l] , d ^ 1) < 2 * m * sum[j] * (sum[q[l + 1]] - sum[q[l]])) l ++ ;
f[j][d] = y(q[l] , d ^ 1) - 2 * m * sum[j] * sum[q[l]] + m * sum[j] * sum[j] - 2 * sum[n] * sum[j];
while(l < r && (y(j , d ^ 1) - y(q[r] , d ^ 1)) * (sum[q[r]] - sum[q[r - 1]]) < (sum[j] - sum[q[r]]) * (y(q[r] , d ^ 1) - y(q[r - 1] , d ^ 1))) r -- ;
q[++r] = j;
}
}
printf("%lld\n" , f[n][m & 1] + sum[n] * sum[n]);
return 0;
}

【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. BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]

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

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

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

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

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

  7. [SDOI2015][bzoj4518] 征途 [斜率优化dp]

    题面 传送门 思路 把$vm^2$展开化一下式子,可以得到这样的等价公式: $vm^2=m\sum_{i=1}^m a_i^2-\sum_{i=1}^m a_i$ 那么我们要最小化的就是$\sum_{ ...

  8. 【BZOJ4518】[Sdoi2016]征途 斜率优化

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

  9. P4072 [SDOI2016](BZOJ4518) 征途 [斜率优化DP]

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

随机推荐

  1. 【转】火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版

    原文地址:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地 ...

  2. js错误处理和调试

    1.重点关注函数和可能导致函数执行失败的因素. 2.抛出错误和使用try-catch的时机:一般来说在应用程序架构较低的层次中经常会抛出错误.这个层次并不会影响当前执行的代码. 错误也得不到真正的处理 ...

  3. mongodb - Replication Set搭建过程

    1.创建目录 mkdir -p /mongodb/data/r1 mkdir -p /mongodb/data/r2 mkdir -p /mongodb/data/r3 mkdir -p /mongo ...

  4. poj 1113 Wall 凸包的应用

    题目链接:poj 1113   单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: #include<iostream> ...

  5. CentOS6.2下安装中文输入法

    因为在程序中需要输入中文,但是系统没有预装中文输入法,所以就安装一下,顺便记录 1.用root登录 ,或su root2.yum install "@Chinese Support" ...

  6. string 大小写转换

      STL的algorithm库确实给我们提供了这样的便利,使用模板函数transform可以轻松解决这个问题,开发人员只需要提供一个函数对象,例如将char转成大写的toupper函数或者小写的函数 ...

  7. JQuery EasyUI datagrid pageNumber 分页 请求/加载 两次

    解决方案: 原因是 jquery.easyui.min.js 源文件中,由于第1页的total和其他页的total不相等,EasyUI会重新发起第1页的请求!1.jQuery EasyUI 1.4.1 ...

  8. js中对小数取整

    js中对小数取整的函数,需要的朋友可以参考下.   1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍 ...

  9. db2 reorg pending

    通常在数据库上线之前,我们都会对数据库做周密的规划,无论在测试阶段还是上线之初,也难免由于需求的更改会对数据中的表做一些更改.而某些alter table语句则会导致该表处于reorg-pending ...

  10. ASP.NET动态增加HTML元素的方法实例小结

    本文实例讲述了ASP.NET动态增加HTML元素的方法.分享给大家供大家参考,具体如下: 在使用asp.net进行web开发的时候页面中的<head></head>中的信息可以 ...