设dp[i][j]表示把从 i 到 j 的石子合并为一堆的最大得分
设d[i][j]表示把从 i 到 j 的石子合并为一堆的最小得分
枚举最后一次合并 ,区间 i j 可由dp[i][k] 和 dp[k + 1][j]两部分合并得到,枚举k
dp[i,j] = max(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j]) ,
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=400;
int n;
int a[N];
int dp[N][N];
int d[N][N];
int sum[N];
int main(){
cin >> n;
sum[0]=0;
for(int i = 1; i <= n; i++){
cin >> a[i];
a[i+n] = a[i];
}
for(int i = 1; i <= 2*n; i++){
sum[i] = sum[i-1] + a[i];
dp[i][i] = 0;
d[i][i] = 0;
}
for(int len = 2; len <= n;len++){
for(int i = 1; i + len -1 <= 2*n; i++){
int j = i + len - 1;
d[i][j] = 1e9;
for(int k = i; k < j; k++){
dp[i][j] = max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
d[i][j] = min(d[i][j],d[i][k]+d[k+1][j]+sum[j]-sum[i-1]);
}
}
}
int mi=1e9,ma=0;
for(int i = 1; i <= n; i++){
ma = max(dp[i][i+n-1],ma);
mi = min(d[i][i+n-1],mi);
}
cout << mi << "\n" << ma << endl;
return 0;
}