zoukankan      html  css  js  c++  java
  • 【bzoj4518】征途

    懒得推式子了,总之是个斜率优化……

    先化一下题目要求的式子,再写一下dp方程,然后就是很自然的斜率优化了qwq

    #include<bits/stdc++.h>
    #define N 3005
    typedef long long ll;
    int n,m,l,r,d[N],q[N];
    ll f[N][N],s[N];
    inline double slope(int i,int x,int y){
        return 1.0*(f[i][x]+s[x]*s[x]-f[i][y]-s[y]*s[y])/(s[x]-s[y]);
    }
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){
        n=read();m=read();
        for(int i=1;i<=n;i++)d[i]=read();
        for(int i=1;i<=n;i++)s[i]=s[i-1]+d[i];
        memset(f,0x3f,sizeof(f));f[0][0]=0;
        for(int i=1;i<=m;i++){
            l=0;r=0;
            for(int j=1;j<=n;j++){
                for(;l<r&&slope(i-1,q[l],q[l+1])<2*s[j];l++);
                f[i][j]=f[i-1][q[l]]+(s[j]-s[q[l]])*(s[j]-s[q[l]]);
                for(;l<r&&slope(i-1,q[r],q[r-1])>slope(i-1,q[r],j);r--);
                q[++r]=j;
            }
        }
        printf("%d
    ",m*f[m][n]-s[n]*s[n]);
        return 0;
    }
  • 相关阅读:
    如何保持页脚始终在页面底部
    CSS自适应宽度圆角按钮
    ACM1004
    java输出格式
    北大ACM1001题Exponentiation(求高精度幂)
    深入理解sizeof
    java之类BigDecimal
    ACM1003
    ACM1005
    C的输出格式printf
  • 原文地址:https://www.cnblogs.com/zcysky/p/7007627.html
Copyright © 2011-2022 走看看