原文地址: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;
}

转载于:https://www.cnblogs.com/GXZlegend/p/6812435.html

【bzoj4518】[Sdoi2016]征途 斜率优化dp相关推荐

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

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

  2. [BZOJ4518][SDOI2016]征途[斜率优化]

    王道征途 \[ \text{题目要求的东西可以化成}m\times \sum_{i=1}^m{d\left[ i \right] ^2-pre\left[ n \right] ^2} \\ \text ...

  3. 【BZOJ4518】征途,斜率优化DP

    写在前面:当时考场上想到了搞一个二维队列记录上次的函数值,但莫名就感觉这样和N^3做法没有区别(这告诉我们当你写出部分分而且还有大把的时间时就不要放弃写标算的希望),就弃疗了,不过就算搞出来了应该也不 ...

  4. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  5. 学习笔记——斜率优化dp

    注:文中全部图片均为手绘,不喜勿喷 总论 斜率优化是dp优化中极其常用的一种手法 第一点,先要懂什么是凸包与单调队列 先来看看凸多边形是什么样 接着再是斜率及斜率优化 一.凸包及凸多边形 凸多边形 就 ...

  6. 【总结】斜率优化DP

    于是,XSC062开始写总结. 斜率优化DP 前置芝士 单调队列优化DP(夹带私货) 正文 我们以一道题为例. 打印文章 双倍经验 三倍经验 Solution 明显DP. 那么DP式就是: f i = ...

  7. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  8. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  9. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

最新文章

  1. RNN和LSTM的正向/前向传播-图示公式和代码
  2. 第一百一十四节,JavaScript文档对象,DOM进阶
  3. 公司用了 6 年的分布式锁,很是牛逼啊!
  4. NT系统DOS网络命令记录
  5. 解密昇腾AI处理器--DaVinci架构(总览)
  6. java内存模型作用是什么_什么是JVM内存模型?
  7. gitea无法连接mysql_Git push ERROR: Repository not found fatal:无法连接远程数据库
  8. 直接用自己服务器做图床可以吗_图床趣事
  9. java万能万年历的程序_Java编写多功能万年历程序的实例分享
  10. 废物利用--旧手机搭建linux服务器
  11. 国内外酒店软件公司发展简介(转)
  12. 运维的工作内容是什么?有哪几种分类?
  13. Win7下虚拟机安装Mac OS X
  14. vue 项目中 自动生成 二维码
  15. 微信小程序识别字符串中的手机号,手机号高亮显示,并且可以点击这个手机号,拨打电话?
  16. CocosEditor For JS (Cocos2d-JS) 教程聚合和代码下载
  17. 对IQueryable和IEnumerable的认识
  18. 出现错误(已解决)RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA ker
  19. Game35传销模式的合约代码公布
  20. OSChina 周日乱弹 ——还是有个程序员女朋友好!

热门文章

  1. 计算机网络实验二抓包协议分析,计算机网络实验-使用Wireshark分析TCP和UDP协议...
  2. TKDragView_TKCalendarView:页面curl的动画日历
  3. 李迟2021年4月知识总结
  4. mysql内置时间函数大全_MySQL 的时间函数 大全
  5. 【Arthas】Arthas Command处理流程
  6. 【Spring】Spring Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required
  7. 【ElasticSearch】Es 源码之 LifecycleComponent 源码解读
  8. 【jvm】jvm jstack使用 Java线程Dump分析
  9. 【kibana】状态异常 Status: Red Unable to connect to Elasticsearch at http://127.0.0.1:9200.
  10. 【kafka】InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0