您的位置:首页 > 其它

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

2017-06-17 12:17 337 查看
鸽了好多天啊..

题目描述



输入输出格式





显然的斜率优化问题

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]−2∗a∗pre[i]∗pre[k]−a∗pre[k]2−b∗pre[k]<f[j]−2∗a∗pre[i]∗pre[j]+a∗pre[j]2−b∗pre[j]

然后移个项

2∗a∗pre[i]∗(pre[j]−pre[k])<f[j]−f[k]+a∗pre[j]2−a∗pre[k]2−b∗pre[j]+b∗pre[k]

pre[i]<f[j]−f[k]+a∗(pre[j]2−pre[k]2)+b∗(pre[k]−pre[j])2∗a∗(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 long
const 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
;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: