hdu 3507 Print Article 斜率优化DP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanbaobao829/article/details/83151883
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5*1e5+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,m,lis[maxn],head,tail;
ll dp[maxn],a[maxn];
ll get_up(int i,int j)
{
    return dp[j]+a[j]*a[j]-dp[i]-a[i]*a[i];
}
ll get_down(int i,int j)
{
    return 2*(a[j]-a[i]);
}
void get_dp(int i,int j)
{
    dp[j]=dp[i]+(a[j]-a[i])*(a[j]-a[i])+m;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",a+i);
            a[i]+=a[i-1];
        }
        head=tail=0;
        lis[tail++]=0;
        for(int i=1;i<=n;i++)
        {
            while(head+1<tail&&get_up(lis[head],lis[head+1])<=a[i]*get_down(lis[head],lis[head+1]))
                ++head;
            get_dp(lis[head],i);
            while(head+1<tail&&get_up(lis[tail-1],i)*get_down(lis[tail-2],lis[tail-1])<=get_down(lis[tail-1],i)*get_up(lis[tail-2],lis[tail-1]))
                --tail;
            lis[tail++]=i;
        }
        printf("%lld\n",dp[n]);
    }
    return 0;
}
/*
5 5
5
9
5
7
5
*/

猜你喜欢

转载自blog.csdn.net/fanbaobao829/article/details/83151883