BZOJ 1911: [Apio2010]特别行动队 斜率优化dp

本文介绍了一种使用斜率DP解决特定类型最优化问题的方法,并通过BZOJ1911题目的实例演示了如何实现斜率DP算法。文章详细展示了DP方程的推导过程及完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1911
解法:斜率DP
dpf[i]=max(f[j]+a(sum[i]sum[j])2+b(sum[i]sum[j])+c)

j>kjk

f[j]f[k]+asum[j]2asum[k]2+b(sum[k]sum[j])>2a(sum[j]sum[k])sum[i]

//BZOJ 1911

#include <bits/stdc++.h>
using namespace std;
int n, l, r, a, b, c;
int x[1000010];
long long sum[1000010], dp[1000010];
int q[1000010];
inline long long sqr(long long x) {return x*x;}
inline double getxl(int k, int j){
    return (double)(dp[j] - dp[k] + a*(sqr(sum[j]) - sqr(sum[k])) + b*(sum[k]-sum[j]))/(double)(2*a*(sum[j]-sum[k]));
}
int main()
{
    scanf("%d%d%d%d", &n, &a, &b, &c);
    for(int i = 1; i <= n; i++) scanf("%d", &x[i]);
    for(int i = 1; i <= n; i++) sum[i] = sum[i-1] + x[i];
    for(int i = 1; i <= n; i++){
        while(l < r && getxl(q[l], q[l+1]) < sum[i]) l++;
        int t = q[l];
        dp[i] = dp[t] + a*sqr(sum[i]-sum[t])+b*(sum[i]-sum[t])+c;
        while(l < r && getxl(q[r-1], q[r]) > getxl(q[r], i)) r--;
        q[++r] = i;
    }
    printf("%lld\n", dp[n]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值