思路

解决是个圈的问题,直接复制一遍数组,然后跑区间DP就好了。 区间DP是先枚举长度,再枚举起点,然后在起点和终点之间枚举中间点,表示合并的两个区间。

代码

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n,a[205],mx[205][205],mi[205][205],sum[205];
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		a[i+n]=a[i];
	} 
	sum[0]=0;
	for(int i=1;i<=2*n;i++){
		sum[i]=sum[i-1]+a[i];
	}
	memset(mx,0,sizeof(mx));
	memset(mi,127/3,sizeof(mi));
	for(int i=1;i<=2*n;i++) mi[i][i]=0;
	for(int len=2;len<=n;len++){
		for(int l=1;l<=2*n-len+1;l++){
			int r=l+len-1;
			for(int k=l;k<r;k++){
				mx[l][r]=max(mx[l][r],mx[l][k]+mx[k+1][r]+sum[r]-sum[l-1]);
				mi[l][r]=min(mi[l][r],mi[l][k]+mi[k+1][r]+sum[r]-sum[l-1]);
			}
		}
	}
	int maxx=-10000000,minn=10000000;
	for(int i=1;i<=n;i++){
		maxx=max(maxx,mx[i][i+n-1]);
		minn=min(minn,mi[i][i+n-1]);	
	}
	cout<<minn<<endl;
	cout<<maxx<<endl;
	return 0;
}