石子合并
#include<iostream>
#include<cstring>
using namespace std;
int ma[300][300];
int h[300][300];
int a[300];
int main()
{
int n,max,sum,i,k,ii,j,f;
while(cin>>n)
{
for(i=0;i<n;i++)
cin>>a[i];
for(i=n;i<=2*n-1;i++)
a[i]=a[i-n];
memset(ma,0,sizeof(ma));
memset(h,0,sizeof(h));
for(i=1;i<n;i++)//合并i个
{
for(j=0;j<n;j++)//从第i个合并
{
max=0;
f=9999999;
for(k=j;k<j+i;k++)
{
if(max<ma[j][k]+ma[k+1][j+i])
max=ma[j][k]+ma[k+1][j+i];
if(f>h[j][k]+h[k+1][j+i])
{
f=h[j][k]+h[k+1][j+i];
}
}
sum=0;
for(ii=j;ii<=j+i;ii++)
sum+=a[ii];
ma[j][j+i]=max+sum;
if(f==999999) f=0;
h[j][j+i]=f+sum;
if(j+i+n<=n*2-1)//对称分布
{
ma[j+n][j+i+n]=ma[j][j+i];
h[j+n][j+i+n]=h[j][j+i];
}
}
}
max=0;
for(i=0;i<n;i++)
if(max<ma[i][i+n-1])
max=ma[i][i+n-1];
f=9999999;
int x;
for(i=0;i<n;i++)
if(f>h[i][i+n-1])
{
x=i;
f=h[i][i+n-1];
}
cout<<f<<endl;
cout<<max<<endl;
}
return 0;
}