【BZOJ4518】[SDOI2016] 征途(重拾斜率优化DP)
大致题意: 让你把一个长度为\(n\)的序列划分成\(m\)块,求每块数总和的最小方差乘\(m^2\)的值。
转化方差
首先方差显然是一个比较复杂的东西,需要进行一定转化。
设\(p_i\)为第\(i\)块数总和;\(s_i\)为原序列的前缀和,即\(s_i=\sum_{i=1}^ia_i\);\(\bar p\)为\(p_i\)的平均值,即\(\bar{p}=\frac{\sum_{i=1}^mp_i}m=\frac{s_n}m\)。
然后推式子:
\]
其中\(\sum_{i=1}^mp_i\)显然就是\(s_n\),同时我们把\(\bar{p}\)的值代入得到:
\]
动态规划
考虑上面这个式子,其中\(m,s_n^2\)都是常数,因此我们只需要最小化\(p_i\)平方和。
可以考虑动态规划。
设\(f_{i,j}\)表示当前第\(i\)位,已划分出\(j\)块时的\(p_i\)平方和的最小值。
显然暴力转移只需枚举一个转移点:
\]
这就是\(O(n^3)\)的做法了。
斜率优化
显然上面的\(DP\)还不够优,需要优化。
这里我们考虑斜率优化。
设当前为\(i\),比较对于\(a\)和\(b\)两个转移点,若我们选择\(a\)进行转移,则需要满足:
\]
拆平方并移项:
\]
两边同除以\(s_b-s_a\)得:
\]
设\(A(x)=s_x,B(x)=f_{x,j-1}+s_x^2\),则上面的式子就相当于:
\]
这是一个斜率的形式。
那么我们就可以开一个单调队列维护一个斜率逐渐上升的序列。
然后每次转移之前,将队首斜率小于\(2s_i\)的几项弹掉再转移即可。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 3000
#define INF 1e9
using namespace std;
int n,m,a[N+5],s[N+5],q[N+5],f[N+5][N+5];
int main()
{
RI i,j,H,T;for(scanf("%d%d",&n,&m),i=1;i<=n;++i) scanf("%d",a+i),s[i]=s[i-1]+a[i];//读入+初始化前缀和
#define A(x) (s[x])
#define B(x) (f[x][j-1]+s[x]*s[x])
#define S(x,y) (1.0*(B(y)-B(x))/(A(y)-A(x)))
#define Slope (2.0*s[i])
for(i=1;i<=n;++i) f[i][0]=INF;//初始化
for(j=1;j<=m;++j) for(q[H=T=1]=0,i=1;i<=n;++i)//注意要先枚j
{
W(H<T&&Slope>=S(q[H],q[H+1])) ++H;//弹掉不合法队首
f[i][j]=f[q[H]][j-1]+(s[i]-s[q[H]])*(s[i]-s[q[H]]);//转移
W(H<T&&S(q[T-1],q[T])>=S(q[T-1],i)) --T;q[++T]=i;//保证单调递增,放入队尾
}return printf("%lld",1LL*m*f[n][m]-1LL*s[n]*s[n]),0;//输出答案
}
【BZOJ4518】[SDOI2016] 征途(重拾斜率优化DP)的更多相关文章
- [luogu4072][bzoj4518][SDOI2016]征途【动态规划+斜率优化】
题目分析 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- bzoj4518[Sdoi2016]征途 斜率优化dp
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1657 Solved: 915[Submit][Status] ...
- BZOJ4518 Sdoi2016 征途 【斜率优化DP】 *
BZOJ4518 Sdoi2016 征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m ...
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
- [SDOI2015][bzoj4518] 征途 [斜率优化dp]
题面 传送门 思路 把$vm^2$展开化一下式子,可以得到这样的等价公式: $vm^2=m\sum_{i=1}^m a_i^2-\sum_{i=1}^m a_i$ 那么我们要最小化的就是$\sum_{ ...
- 斜率优化dp练习
1.HDU3507 裸题,有助于理解斜率优化的精髓. dp[i]=min(dp[j]+m+(sum[i]-sum[j])2) 很显然不是单调队列. 根据斜率优化的的定义,就是先设两个决策j,k 什么时 ...
- 斜率优化dp 的简单入门
不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...
- 【洛谷3648/BZOJ3675】[APIO2014]序列分割(斜率优化DP)
题目: 洛谷3648 注:这道题洛谷3648有SPJ,要求输出方案.BZOJ3675数据组数较多但不要求输出方案. 分析: 这可能是我第三次重学斜率优化了--好菜啊 这道题首先一看就是个DP.稍微推一 ...
随机推荐
- css 适配
https://blog.csdn.net/weixin_35467885/article/details/80778992 1.通过link方法 link方法引入媒体类型其实就是在标签引用样式的时候 ...
- 【Linux命令】安装命令(yum,rpm)
安装软件有三种方式,第一种是源码安装(源码安装需要手动安装软件,安装的目录,还需要进行编译之后才能安装),步骤比较繁琐.第二种是RPM安装,rpm安装有点像windows系统的面板,会建立统一的数据库 ...
- pytest框架优化——清理历史截图图片和allure报告文件
痛点分析: 当我们每次执行完用例的时候,如果出现bug或者是测试脚本出了问题,一般会通过测试报告.异常截图.日志来定位分析,但是我们发现运行次数多了之后,异常截图和测试报告会不停地增多,对我们定位分析 ...
- jQuery 源码分析(十二) 数据操作模块 html特性 详解
jQuery的属性操作模块总共有4个部分,本篇说一下第1个部分:HTML特性部分,html特性部分是对原生方法getAttribute()和setAttribute()的封装,用于修改DOM元素的特性 ...
- idea设置类注释和方法注释
类注释 1.file-->setting-->editor-->file and code templates-->includes--> file header 2.在 ...
- 聊聊业务系统中投递消息到mq的几种方式
背景 电商中有这样的一个场景: 下单成功之后送积分的操作,我们使用mq来实现 下单成功之后,投递一条消息到mq,积分系统消费消息,给用户增加积分 我们主要讨论一下,下单及投递消息到mq的操作,如何实现 ...
- Redis系列---redis简介01
一. 本章我们将用简短的几句话来帮助你快速的了解什么是redis,初学者不必深究 1 Redis简介 Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写 ...
- .net 数据源DataSet 转换成模型
/// <summary> /// DataSet转换成model 自动赋值返回集合 /// </summary> /// <typeparam name="T ...
- python基础(26):类的成员(字段、方法、属性)
1. 字段 字段:包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 字段的定义和使用: class Province: # ...
- Python爬取上交所一年大盘数据
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 半个码农2018 PS:如有需要Python学习资料的小伙伴可以加点 ...