题链
区间,环形
区间动态规划,从小到大 枚举长度
区间动态规划的特点是 线段被重复使用
#include<bits/stdc++.h>
#define go(i,a,b) for(int i=a;i<=b;++i)
#define ll long long
using namespace std;
int dpmi[200+10][200+10];
int dpma[200+10][200+10];
int a[200+10];
int sum[200+10];
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
int main(){
int n;
cin>>n;
go(i,1,n){scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i];}
go(i,1,n) sum[i+n]=sum[i]+sum[n];
go(len,2,n){
for(int i=1;i+len-1<=2*n;++i){
int j=i+len-1;
dpmi[i][j]=INT_MAX;
//printf("%d %d==========\n",dpmi[i][j],dpma[i][j]);
go(k,i,j-1)
dpmi[i][j]=min(dpmi[i][j],dpmi[i][k]+dpmi[k+1][j]+sum[j]-sum[i-1]),
dpma[i][j]=max(dpma[i][j],dpma[i][k]+dpma[k+1][j]+sum[j]-sum[i-1]);
//printf("%d %d==========\n",dpmi[i][j],dpma[i][j]);
}
}
int ansmi=dpmi[1][n],ansma=dpma[1][n];
for(int i=2;i+n-1<=2*n;++i)
ansma=max(ansma,dpma[i][i+n-1]),ansmi=min(ansmi,dpmi[i][i+n-1]);
printf("%d\n%d",ansmi,ansma);
return 0;
}