#include <iostream>
using namespace std;
int n,x[205],dp1[205][205],dp2[205][205],sum[205],ans1=-0x3f3f3f3f,ans2 = 0x3f3f3f3f;
// n^3 区间dp。 
int main(){
    cin >> n;
    for(int i = 1;i <= n;i++){
        cin >> x[i];
		x[i+n] = x[i];
    }
	for(int i = 1;i <= n * 2;i++)sum[i] = sum[i-1] +x[i];
    for(int l = 2;l <= n;l++){
        for(int i = 1;i<=2*n-l+1;i++){ 	
			int j = i + l - 1;
       		// 模板,i 是左节点,j 是右节点
            dp2[i][j] = 0x3f3f3f3f;
			dp1[i][j] = -0x3f3f3f3f;
            for(int k = i;k < j;k++){
            	// [i,j] 分割成两部分,先合并左边[l,k],再合并右边[k+1,j],再加上这一段的合并 
                dp1[i][j] = max(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
                dp2[i][j] = min(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
            }
        }
    }
	for (int i=1;i<=n;i++){
        ans1=max(ans1,dp1[i][i+n-1]);
        ans2=min(ans2,dp2[i][i+n-1]);
    }
    cout << ans2 << endl << ans1;
    return 0;
}

0 条评论

目前还没有评论...