1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4 #define MAX 0x3f
5 int f[2005][2005];
6 int g[2005][2005];
7 int a[2005],sum[2005];
8
9 int main()
10 {
11 memset(f,MAX,sizeof(f));
12 memset(g,0,sizeof(g));//why0??
13 int n;
14 cin>>n;
15 for(int i=1;i<=n;i++)
16 {
17 cin>>a[i];
18 a[i+n]=a[i];
19 }
20 for(int i=1;i<2*n;i++)
21 sum[i]=sum[i-1]+a[i];
22 for(int i=1;i<2*n;i++)
23 f[i][i]=0;//!!!对角线初始化,保证第一次选择选到0
24
25 for(int i=2*n;i>=1;i--)//阶段
26 for(int j=i+1;j<=2*n-1;j++)//状态
27 {
28 for(int k=i;k<j;k++)//决策
29 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum[j]-sum[i-1]),
30 g[i][j]=max(g[i][j],g[i][k]+g[k+1][j]+sum[j]-sum[i-1]);
31 }
32 int ans1=f[1][n],ans2=g[1][n];
33 for(int i=1;i<=n;i++)
34 ans1=min(ans1,f[i][i+n-1]),
35 ans2=max(ans2,g[i][i+n-1]);
36 cout<<ans1<<endl<<ans2<<endl;
37 return 0;
38 }