好像是求最大值的时候出了些问题,但是感觉和求最小值原理一样,没发现问题
#include <bits/stdc++.h>
using namespace std;
const int MAX=305;
int a[MAX*2];
int sum[MAX][MAX];
int dp[MAX][MAX];//求最小
int dpp[MAX][MAX];//求最大
int n;
void init() {
cin>>n;
for (int i=1;i<=n;i++) {
cin>>a[i];
sum[i][i]=a[i];
a[i+n]=a[i];
sum[i+n][i+n]=sum[i][i];
}
n*=2;
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++)
sum[i][j]=sum[i][j-1]+a[j];
}
int main() {
init();
memset(dp,0x3f,sizeof(dp));
for (int i=1;i<=n;i++)
dp[i][i]=0;
for (int len=2;len<=n/2;len++)
for (int l=1;l<=n-len+1;l++) {
int r=l+len-1;
for (int p=l;p<r;p++) {
dp[l][r]=min(dp[l][r],sum[l][p]+sum[p+1][r]+dp[l][p]+dp[p+1][r]);
dpp[l][r]=max(dp[l][r],sum[l][p]+sum[p+1][r]+dpp[l][p]+dpp[p+1][r]);
}
}
int ansMin=0x3f3f3f3f,ansMax=0;
n/=2;
for (int i=1;i<=n;i++) {
ansMin=min(ansMin,dp[i][i+n-1]);
ansMax=max(ansMax,dpp[i][i+n-1]);
}
cout<<ansMin<<endl<<ansMax<<endl;
cout<<dp[1][n]<<" "<<dp[n+1][n+n];
return 0;
}