您的位置:首页 > 其它

hdu 3507 斜率dp

2013-10-14 10:27 225 查看
思路:dp[i]=dp[j]+(sum[i]-sum[j])^2+m;

剩下的就是普通斜率dp做法。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define Maxn 500010
#define LL __int64
using namespace std;
LL dp[Maxn],num[Maxn],sum[Maxn];
int que[Maxn*2];
LL getleft(int j,int k)
{
return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);
}
LL getright(int j,int k)
{
return 2*(sum[j]-sum[k]);
}
int main()
{
int n,m,i,j,head,rear;
while(scanf("%d%d",&n,&m)!=EOF){
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
scanf("%I64d",num+i);
sum[i]=sum[i-1]+num[i];
}
head=1,rear=0;
que[++rear]=0;
for(i=1;i<=n;i++){
while(head<rear&&getleft(que[head+1],que[head])<sum[i]*getright(que[head+1],que[head]))
head++;
dp[i]=dp[que[head]]+(sum[i]-sum[que[head]])*(sum[i]-sum[que[head]])+m;
while(head<rear&&getleft(i,que[rear])*getright(que[rear],que[rear-1])<=getleft(que[rear],que[rear-1])*getright(i,que[rear]))
rear--;
que[++rear]=i;
}
printf("%I64d\n",dp
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: