您的位置:首页 > 其它

bzoj3156: 防御准备 斜率优化DP

2014-07-22 11:29 218 查看
斜率优化dp,直接推公式。其实斜率优化dp除了推公式,什么都没有了。

/**************************************************************
Problem: 3156
User: xujiahe
Language: C++
Result: Accepted
Time:3632 ms
Memory:27052 kb
****************************************************************/

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define ll long long
#define maxn 1100000
ll f[maxn],a[maxn],q[maxn],n,m,h,t;
double getk(ll k,ll j)
{
double tmp=(2.0*(f[k]-f[j])-j*(j+1)+k*(k+1))/(2.0*(k-j));
return tmp;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
ll tmp;
for (int i=1;i<=n/2;i++)
{
tmp=a[i];
a[i]=a[n-i+1];
a[n-i+1]=tmp;
}
f[1]=a[1];
q[1]=1;
h=t=1ll;
ll ans=a[1]+1ll*n*(n-1)/2ll;
for(int i=2;i<=n;i++)
{
while(h<t&&getk(q[h+1],q[h])<i) h++;
f[i]=f[q[h]]+1ll*(i-q[h])*(i-q[h]-1)/2+a[i];
ans=min(ans,f[i]+1ll*(n-i)*(n-i+1)/2);
while(h<t&&getk(q[t],q[t-1])>getk(i,q[t])) t--;
q[++t]=i;
}
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: