环形合并石子
#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;
}