代码如下:
#include<cstdio>
#include<cstring>
int n,a[201],dp1[201][201],dp2[201][201];
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;++i)
scanf("%d",a+i),a[i+n]=a[i];
for(register int i=1;i<=(n<<1);i?a[i++]+=a[i-2]:i++);
for(register int t=1;t<n;++t)
for(register int i=1,j=t+i,tmp=0x7fffffff;(i<(n<<1))&&(j<(n<<1));++i,j=t+i,tmp=0x7fffffff)
for(register int k=i;k<j;++k)
{
dp2[i][j]=tmp;
dp1[i][j]=max(dp1[i][j],dp1[i][k]+dp1[k+1][j]+a[j]-a[i-1]);
dp2[i][j]=min(dp2[i][j],dp2[i][k]+dp2[k+1][j]+a[j]-a[i-1]);
}
int ans1=0,ans2=0x7fffffff;
for(register int i=1;i<=n;++i)
{
ans1=max(ans1,dp1[i][i+n-1]);
ans2=min(ans2,dp2[i][i+n-1]);
}
for(register int i=1;i<=n;++i)
printf("%d %d\n",dp1[i][i+n-1],dp2[i][i+n-1]);
printf("%d\n%d",ans2,ans1);
}
对于第2 3 4点的最小值会炸