1 条题解

  • 0
    @ 2024-1-22 15:23:37
    #include<bits/stdc++.h>
    using namespace std;
    const int N=410;
    int w[N];
    int s[N];
    int f[N][N],g[N][N];
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>w[i];  
            w[i+n]=w[i]; //扩展
        }
        for(int i=1;i<=2*n;i++)
        {
            s[i]=s[i-1]+w[i]; //前缀和
        }
        memset(f,0x3f,sizeof f); //初始化无穷大
        memset(g,0xcf,sizeof g); //初始化无穷小
        for(int i=1;i<=2*n;i++)  //初始化自己
        {
            f[i][i]=0;
            g[i][i]=0;
        }
        for(int len=2;len<=n;len++) //枚举区间长度
        {
            for(int l=1;l+len-1<=2*n;l++) //区间左端点
            {
                int r=l+len-1; //区间右端点
                for(int k=l;k<r;k++) //枚举合并点
                {
                    f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
                }
            }
        }
        int minv=2e9; //最小值
        for(int i=1;i+n-1<=2*n;i++)
        {
            minv=min(minv,f[i][i+n-1]); //枚举长度为n的区间合并最小值
        }
        for(int len=2;len<=n;len++)
        {
            for(int l=1;l+len-1<=2*n;l++)
            {
                int r=l+len-1;
                for(int k=l;k<r;k++)
                {
                    g[l][r]=max(g[l][r],g[l][k]+g[k+1][r]+s[r]-s[l-1]);
                }
            }
        }
        int maxv=0;;
        for(int i=1;i<=n;i++)
        {
            maxv=max(maxv,g[i][i+n-1]);
        }
        cout<<minv<<endl<<maxv<<endl;
        return 0;
    }
    
    • 1

    信息

    ID
    584
    时间
    1000ms
    内存
    125MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者