P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
int n;
int a[350],sum[350];
const int INF = 1e9+7;
void init()
{
for(int i=1;i<=2*n;i++)
{
sum[i] = sum[i-1]+a[i];
}
}
int getsum(int l,int r)
{
return sum[r]-sum[l-1];
}
int dp1[350][350];
int dp2[350][350];
void Dp()
{
for(int i=1;i<=n;i++)
{
dp1[i][i]=0;
dp2[i][i]=0;
}
for(int i=2;i<=n;i++)
{
for(int j=1;j+i-1<=2*n;j++)
{
int r = j+i-1;
dp1[j][r]=INF;
dp2[j][r]=0;
for(int k=j;k<r;k++)
{
dp1[j][r]=min(dp1[j][r],dp1[j][k]+dp1[k+1][r]+getsum(j,r));
dp2[j][r]=max(dp2[j][r],dp2[j][k]+dp2[k+1][r]+getsum(j,r));
}
}
}
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=n+1;i<=2*n;i++)
{
a[i]=a[i-n];
}
init();
Dp();
int mmin=1e9;
int mmax=0;
for(int i=1;i<=n;i++)
{
mmin = min(mmin,dp1[i][i+n-1]);
mmax = max(mmax,dp2[i][i+n-1]);
}
cout<<mmin<<"\n"<<mmax<<"\n";
return 0;
}