环形合并石子

#include<iostream>
#include<cstring>
int f[1000][1000],s[10000],a[10000];
int k,n,maxn,miny=100000000;
using  namespace std;
int main()
{
    cin>>n;
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s[i]=s[i-1]+a[i];
        f[i][i]=0;        

    }
    for(int i=n+1;i<2*n;i++)
    {
        a[i]=a[i-n];
        s[i]=s[i-1]+a[i];
        f[i][i]=0;        
    }
//    len+l-1=j
    //j-l=len-1
    for(int len=2;len<=n;len++)
    {
        for(int l=1;len+l-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]);
        }
    }
    miny=f[1][n];
    for(int i=2;i<=n;i++)
    {    
        miny=min(miny,f[i][i+n-1]);
    }
//    cout<<f[1][n]<<endl;
    cout<<miny<<endl;
    memset(f,0,sizeof(f));
    for(int len=2;len<=2*n;len++)
    {
        for(int l=1;len+l-1<=2*n;l++)
        {
            int r=l+len-1;
            for(int k=l;k<r;k++)
                f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
        }
    }
//    cout<<f[1][n];
    for(int i=1;i<=n;i++)
    {
        maxn=max(maxn,f[i][i+n-1]);
    }
    cout<<maxn;
    return 0;
}

 

posted @ 2022-09-24 16:25  董苏铭  阅读(19)  评论(0编辑  收藏  举报