#include<bits/stdc++.h>
using namespace std;
const int N = 440;
int f1[N][N];//从第i位开始的n个数,j到k的最小代价
int f2[N][N];//从第i位开始的n个数,j到k的最大代价
int a[N],s[N],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&t);
a[i]=a[i+n]=t;
}
for(int i=1;i<=2*n;i++)
s[i]=s[i-1]+a[i];
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=2*n;i++)
{
int j=i+len-1;
f1[i][j]=0x3f3f3f3f;
f2[i][j]=0;
for(int k=i;k<=j-1;k++)
{
f1[i][j]=min(f1[i][j],f1[i][k]+f1[k+1][j]+s[j]-s[i-1]);
f2[i][j]=max(f2[i][j],f2[i][k]+f2[k+1][j]+s[j]-s[i-1]);
}
}
}
int minres=0x3f3f3f3f;
int maxres=0;
for(int i=1;i<=n;i++)
{
minres=min(minres,f1[i][i+n-1]);
maxres=max(maxres,f2[i][i+n-1]);
}
cout<<minres<<endl<<maxres;
return 0;
}
AcWing 1068. 环形石子合并
最新推荐文章于 2024-08-09 10:25:03 发布