化式子先。 (¯xn∑i=1xi+¯x)2¯x2=¯x2(n∑i=1xi)2+2¯x2n∑i=1xi+¯x2¯x2=(n∑i=1xi)2+2n∑i=1xi+1=(n∑i=1xi+1)2
朴素方程有 Fi,k=min0≤j<i(Fj,k−1+(sumi−sumj+1)2)。
其中 sumi=i∑j=1xj。
首先不考虑段数的限制,方程即 fi=min0≤j<i(fj+(sumi−sumj+1)2)。
假设决策 0≤k<j<i 使得 j 优于 k,即 fj+(sumi−sumj+1)2<fk+(sumi−sumk+1)2fj−2sumi(sumj−1)+(sumj−1)2<fk−2sumi(sumk−1)+(sumk−1)2(fj+(sumj−1)2)−(fk+(sumk−1)2)<2sumi(sumj−sumk)(fj+(sumj−1)2)−(fk+(sumk−1)2)sumj−sumk<2sumi 注意这个地方如果要使用 WQS 二分的话不能包含斜率等于 2sumi 的情况,否则会错(可能没有单调性)。
然后来考虑一下段数的限制,如果直接 O(nm) DP 肯定不行,但是我们发现如果没有这个段数就可以 O(n) 过去。
所以我们就有了 WQS 二分。
主要思想是,如果转移方程是 fi=min0≤j<i(fj+(sumi−sumj+1)2+C),那么 C 越大影响就越大,段数就越少;反之亦然。
所以我们就二分这个 C,找到第一个使得段数 ≤m 的整数 C。
代码:
1 |
|