从一个问题开始
真正理解斜率优化dp
orz ISA
1 问题
Apio 2010 特别行动队
1.1 题意简述
给出一个序列 x1,x2...xn ,将其划分成若干个连续的区间,每一段区间 [l,r] 的价值为 ax2+bx+c ,其中 x=∑i=lrxi
现在你需要最大化序列的价值
1.2 数据范围
对于 20% 的数据, n≤1000
对于 100% 的数据, 1≤n≤106 , −5≤a≤−1 , |b|≤107 , |c|≤107 , 1≤xi≤100
1.3 讨论
1.3.1 20pts
令 f(i) 表示将序列的前i个划分若干段的最大价值, si 表示序列的前缀和
直接根据题意,可以列出状态转移方程
f(i)=max{
f(j)+a∗(si−sj)2+b∗(si−sj)+c},1≤j<i
然后直接dp就可以了
时间复杂度 O(n2)
1.3.2 100pts
数据范围只能允许一个 O(n) 级别的算法
将转移方程进一步展开,能得到
f(i)=max{
f(j)+as2i−2asisj+as2j+bsi−bsj+c},1≤j<i
将其顺序调整,写成下面的形式
f(i)=max{
−2asjsi+f(j)+as2j−bs