BZOJ3156 防御准备 水水的斜率优化(斜率优化总结)

前言

好久没做斜率优化的题了,找个水题来练练手顺便总结一下我对斜率优化的理解。

题目大意

现在有 N 个检查点和一个给定的序列Ai,在一个检查点上放置一座塔的花费是 Ai ,放置一个木偶的花费是该位置右边最近的塔离它的距离(最后一个一定要放塔)。
现在每个检查点必须要放塔或者木偶。问最小的花费。

N <= 106
Ai <= 106

解题思路

一看就知道是裸的斜率优化……
我们可先把序列翻转,设 Fi 表示做完前i个检查点,并且在第i个检查点放置一个塔的最小花费。转移式很简单 Fi=min(Fj+(ij)(ij1)2)j[1,i) 。那么很明显要用斜率优化。

斜率优化-式子的化简

j>k ,那么如果 j 优于k就有:
Fj+(ij)(ij1)2 < Fk+(ik)(ik1)2
2Fj+i22ij+j+j2 < 2Fk+i22ik+k+k2
我们设 Gj=2Fj+j+j2 ,式子两边同时约掉 i2
Gj2ij < Gk2ik
GjGk < i(2j2k)
GjGk2j2k<i (这显然就是斜率的式子)

斜率优化-单调性分析

然后就到了分析单调性的时候了,之前一直对怎么分析单调性一脸懵逼,所以现在仔细的写一写。
我们设 T(k,j)=GjGk2j2k
我们现在知道 GjGk2j2k<i ,我们观察在单调队列中连续的三项应该有什么关系,设这三项为 l,k,j(l<k<j) ,如果单调队列中的斜率是单调递减的,就是说 T(l,k)>T(k,j) ,那么如果 k 是最优解,那么T(l,k)<i而且 T(k,j)>i 。这显然与上面的式子矛盾了!所以 k <script type="math/tex" id="MathJax-Element-31">k</script>是不可能成为优有解的,那么我们只需要维护一个斜率单调递增的序列就可以了。那么每次队首就是我们所要的最有解,而当队首的斜率小于i是我们把他删掉就可以了。

程序

// YxuanwKeith
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;
typedef long long LL;

const int MAXN = 1e6 + 5;

int N, A[MAXN], D[MAXN];
LL F[MAXN], G[MAXN];

double Slope(int x, int y) {
    return 1.0 * (G[y] - G[x]) / (2.0 * (y - x));
}

int main() {
    scanf("%d", &N);
    for (int i = 1; i <= N; i ++) scanf("%d", &A[i]);
    for (int i = 1; i <= N / 2; i ++) swap(A[i], A[N - i + 1]);

    int l = 1, r = 0;
    LL Ans = 1ll << 60;
    for (int i = 1; i <= N; i ++) {
        while (l < r && Slope(D[l], D[l + 1]) < 1.0 * i) l ++;
        int p = D[l];
        F[i] = F[p] + 1ll * (i - p) * (i - p - 1) / 2 + A[i];
        Ans = min(Ans, F[i] + 1ll * (N - i + 1) * (N - i) / 2);
        G[i] = F[i] * 2 + i + 1ll * i * i;
        while (l < r && Slope(D[r - 1], D[r]) > Slope(D[r], i)) r --;
        D[++ r] = i;
    }
    printf("%lld", Ans);
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值