zoukankan      html  css  js  c++  java
  • 一本通1612特别行动队

    1612:特别行动队

    时间限制: 1000 ms         内存限制: 524288 KB

    Description

    Input

    Output

    Sample Input

    4
    -1 10 -20
    2 2 3 4

    Sample Output

    9

    HINT

     
    sol:斜率优化dp裸题

    j<k<i 若k比j优
    dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c (1)
    dp[k]+a*(Qzh[i]-Qzh[k])*(Qzh[i]-Qzh[k])+b*(Qzh[i]-Qzh[k])+c (2)
    (2) >= (1)
    dp[j]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]+b*Qzh[i]-b*Qzh[j]+c (1)
    dp[k]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]+b*Qzh[i]-b*Qzh[k]+c (2)
    若 (2) >= (1) 则
    dp[k]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k] >= dp[j]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]

    (dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j])

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0'); return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    const int N=1000005;
    int n,a,b,c;
    ll Qzh[N];
    ll dp[N];
    int main()
    {
    //    freopen("commando3.in","r",stdin);
        int i,j;
        R(n);
        R(a); R(b); R(c);
        for(i=1;i<=n;i++)
        {
            Qzh[i]=Qzh[i-1]+read();
        }
        memset(dp,-63,sizeof dp);
        dp[0]=0;
        for(i=1;i<=n;i++)
        {
            for(j=0;j<i;j++)
            {
                dp[i]=max(dp[i],dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c);
            }
        }
        Wl(dp[n]);
        return 0;
    }
    /*
    input
    4
    -1 10 -20
    2 2 3 4
    output
    9
    */
    暴力代码
    /*
        j<k<i 若k比j优 
        dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c  (1)
        dp[k]+a*(Qzh[i]-Qzh[k])*(Qzh[i]-Qzh[k])+b*(Qzh[i]-Qzh[k])+c  (2)
        (2) >= (1)
        dp[j]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]+b*Qzh[i]-b*Qzh[j]+c  (1)
        dp[k]+a*Qzh[i]*Qzh[i]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]+b*Qzh[i]-b*Qzh[k]+c  (2)
        若 (2) >= (1) 则
        dp[k]-a*2*Qzh[i]*Qzh[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k] >= dp[j]-a*2*Qzh[i]*Qzh[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]
        则
        (dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j])
    */
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0'); return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    const int N=1000005;
    int n,a,b,c;
    ll Qzh[N];
    ll dp[N],Que[N];
    inline bool Panduan(int j,int k,int i) //j<k<i
    {
        ll S1=(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]);
        ll S2=a*2*Qzh[i]*(Qzh[k]-Qzh[j]);
        return (S1>=S2)?(1):(0);
    }
    //(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]) >= a*2*Qzh[i]*(Qzh[k]-Qzh[j])
    inline bool Panduan_Rev(int j,int k,int i) //j<k<i
    {
        ll S1=((dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k])-(dp[j]+a*Qzh[j]*Qzh[j]-b*Qzh[j]))*(Qzh[i]-Qzh[k]);
        ll S2=((dp[i]+a*Qzh[i]*Qzh[i]-b*Qzh[i])-(dp[k]+a*Qzh[k]*Qzh[k]-b*Qzh[k]))*(Qzh[k]-Qzh[j]);
        return (S1<=S2)?(1):(0);
    }
    int main()
    {
        int i,j;
        R(n);
        R(a); R(b); R(c);
        for(i=1;i<=n;i++)
        {
            Qzh[i]=Qzh[i-1]+read();
        }
        dp[0]=0;
        int Head=1,Tail=1; Que[1]=0;
        for(i=1;i<=n;i++)
        {
            while(Head<Tail&&Panduan(Que[Head],Que[Head+1],i)) Head++;
            j=Que[Head];
            dp[i]=dp[j]+a*(Qzh[i]-Qzh[j])*(Qzh[i]-Qzh[j])+b*(Qzh[i]-Qzh[j])+c;
            while(Head<Tail&&Panduan_Rev(Que[Tail-1],Que[Tail],i)) Tail--;
            Que[++Tail]=i;
        }
        Wl(dp[n]);
        return 0;
    }
    /*
    input
    4
    -1 10 -20
    2 2 3 4
    output
    9
    */
    斜率优化
     
  • 相关阅读:
    __PRETTY_FUNCTION__, __FUNCTION__, __func__
    Python.with
    golang配置
    论单位转个人的社保金融社保卡的作用
    面试题
    平衡是一门艺术
    画原型是节省人力的最好办法
    推荐给非互联网主体的用户
    iOS 点击返回键崩溃的未解之谜
    服务请求比较慢SYN flooding
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10415438.html
Copyright © 2011-2022 走看看