zoukankan      html  css  js  c++  java
  • HDU 3507 Print Article(斜率优化)

    显然的斜率优化模型

    但是单调队列维护斜率单调性的时候出现了莫名的锅orz

    代码

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <deque>
    #define int long long
    using namespace std;
    int a[500100],dp[500100],n,m,sum[500100],q[500100],h=1,t=0;
    int f(int x){
        return dp[x]+sum[x]*sum[x];
    }
    signed main(){
        while(scanf("%lld %lld",&n,&m)==2){
            // memset(dp,0x3f,sizeof(dp));
            dp[0]=0;
            sum[0]=0;
            h=0,t=0;
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
            // for(int i=1;i<=n;i++)
            //     for(int j=i-1;j>=0;j--)
            //         dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*(sum[i]-sum[j])+m);
            q[t++]=0;
            for(int i=1;i<=n;i++){
                while(h+1<t&&(f(q[h+1])-f(q[h]))<=2*sum[i]*(sum[q[h+1]]-sum[q[h]]))
                    h++;
                dp[i]=dp[q[h]]+(sum[i]-sum[q[h]])*(sum[i]-sum[q[h]])+m;
                while(h+1<t&&(sum[q[t-1]]-sum[q[t-2]])*(f(i)-f(q[t-1]))<=(f(q[t-1])-f(q[t-2]))*(sum[i]-sum[q[t-1]]))
                    t--;
                q[t++]=i;
            }
            printf("%lld
    ",dp[n]);
        }
        return 0;
    }
    
    
  • 相关阅读:
    php1
    c# out参数
    c#冒泡算法
    c#方法 最大值我最小值
    方法
    OUT参数
    芮年
    PHP博客
    数组习题
    从郑和下西洋 到华人爱燕窝
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10200243.html
Copyright © 2011-2022 走看看