#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;
int n,f1[N][N],f2[N][N],a[N],sum[N];
void init() {
cin>>n;//输入
memset(f1,0x3f,sizeof(f1));//求最小值
memset(f2,0xcf,sizeof(f2));//求最大值
for(int i=1; i<=n; ++i) {
cin>>a[i];//输入
sum[i]=sum[i-1]+a[i];//前缀和累加
f1[i][i]=f2[i][i]=0;//初始化
}
for(int i=n+1; i<=2*n-1; ++i) {//破环为链
a[i]=a[i-n];//存两边
sum[i]=sum[i-1]+a[i];//前缀和累加
f1[i][i]=f2[i][i]=0;//初始化
}
}
void solve() {
for(int len=2; len<=n; ++len)//阶段:长度
for(int l=1; l<=n-len+1; ++l) {//状态:左端点
int r=l+len-1;//状态:右端点
for(int k=l; k<r; ++k) {//决策:断点
f1[l][r]=min(f1[l][r],f1[l][k]+f1[k+1][r]);//求最小值
f2[l][r]=max(f2[l][r],f2[l][k]+f2[k+1][r]);//求最大值
}
f1[l][r]+=sum[r]-sum[l-1];//补足最小值
f2[l][r]+=sum[r]-sum[l-1];//补足最大值
}
}
void out() {
int ans1=0x3f3f3f3f,ans2=0xcfcfcfcf;//答案
for(int i=1; i<=n; ++i) {//枚举所有链
ans1=min(ans1,f1[i][i+n-1]);//求最小值
ans2=max(ans2,f2[i][i+n-1]);//求最大值
}
cout<<ans1<<endl<<ans2<<endl;//输出
}
int main() {
init();
solve();
out();
return 0;
}
难道是破环为链的问题?