【动态规划16】bzoj1911 [Apio2010]特别行动队(斜率优化)

来源:互联网 发布:python scala 编辑:程序博客网 时间:2024/05/08 16:53

鸽了好多天啊..

题目描述

这里写图片描述

输入输出格式

这里写图片描述
这里写图片描述
显然的斜率优化问题
O(n^2)的动规方程很显然
f[i]=max(f[j]+a(pre[i]pre[j])2+b(pre[i]pre[j])+c)j<=i
k<j<i,且从j转移比从k转移情况更优
f[k]+a(pre[i]pre[k])2+b(pre[i]pre[k])<f[j]+a(pre[i]pre[j])2+b(pre[i]pre[j])
随便消一消,搞一搞
f[k]2apre[i]pre[k]apre[k]2bpre[k]<f[j]2apre[i]pre[j]+apre[j]2bpre[j]
然后移个项
2apre[i](pre[j]pre[k])<f[j]f[k]+apre[j]2apre[k]2bpre[j]+bpre[k]
pre[i]<f[j]f[k]+a(pre[j]2pre[k]2)+b(pre[k]pre[j])2a(pre[j]pre[k])
之后就与http://blog.csdn.net/flanoc/article/details/73190005一样了(骗个点击量)

#include<bits/stdc++.h>#define fer(i,j,n) for(int i=j;i<=n;i++)#define far(i,j,n) for(int i=j;i>=n;i--)#define ll long longconst int maxn=1000010;const int INF=1e9+7;using namespace std;/*----------------------------------------------------------------------------*/inline ll read(){    char ls;ll x=0,sng=1;    for(;ls<'0'||ls>'9';ls=getchar())if(ls=='-')sng=-1;    for(;ls>='0'&&ls<='9';ls=getchar())x=x*10+ls-'0';    return x*sng;}/*----------------------------------------------------------------------------*/ll n,a,b,c;ll pre[maxn],f[maxn];ll q[maxn],h,t;ll calcK(int j,int k){    return (f[j]-f[k]+a*(pre[j]*pre[j]-pre[k]*pre[k])+b*(pre[k]-pre[j]))/(2*a*(pre[j]-pre[k]));}int main(){    n=read();    a=read();b=read();c=read();    fer(i,1,n)    pre[i]=read()+pre[i-1];    h=t=0;    fer(i,1,n)    {        while(h<t&&calcK(q[h],q[h+1])<pre[i])h++;        f[i]=f[q[h]]+a*(pre[i]-pre[q[h]])*(pre[i]-pre[q[h]])+b*(pre[i]-pre[q[h]])+c;        while(h<t&&calcK(q[t-1],q[t])>calcK(q[t],i))t--;        q[++t]=i;    }    cout<<f[n];}
阅读全文
0 0
原创粉丝点击