题解好像都是展成两倍长度,不知道是不是这个问题
#include<cstdio>
#include<cstring>
using namespace std;
int n,a[110],s[110],f1[110][110],f2[110][110];
int min(register int x,register int y){return x<y?x:y;}
int max(register int x,register int y){return x>y?x:y;}
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
memset(f1,10,sizeof(f1));
for(register int i=1;i<=n;i++) f1[i][i]=0;
for(register int k=1;k<n;k++)
{
for(register int i=1;i+k<=n;i++)
for(register int j=0;j<k;j++)
f1[i][i+k]=min(f1[i][i+j]+f1[i+j+1][i+k]+s[i+k]-s[i-1],f1[i][i+k]),
f2[i][i+k]=max(f2[i][i+j]+f2[i+j+1][i+k]+s[i+k]-s[i-1],f2[i][i+k]);
for(register int i=n-k+1;i<=n;i++)
for(register int j=0;j<k;j++)
f1[i][i+k-n]=min(f1[i][((i+j)%n==0)?n:((i+j)%n)]+f1[((i+j+1)%n==0)?n:((i+j+1)%n)][i+k-n]+s[i+k-n]+s[n]-s[i-1],f1[i][i+k-n]),
f2[i][i+k-n]=max(f2[i][((i+j)%n==0)?n:((i+j)%n)]+f2[((i+j+1)%n==0)?n:((i+j+1)%n)][i+k-n]+s[i+k-n]+s[n]-s[i-1],f2[i][i+k-n]);
}
printf("%d\n%d",f1[1][n]-1,f2[1][n]);
return 0;
}