区间DP2:1068
作者:
总打瞌睡的天天啊
,
2024-10-17 15:18:51
,
所有人可见
,
阅读 2
//类似石子合并,只需要把环拉直就行
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=210,INF=0x3f3f3f3f;
int a[N],s[N];
int f[N][N],g[N][N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i],a[i+n]=a[i];
}
for(int i=1;i<=n*2;i++)
{
s[i]=s[i-1]+a[i];
}
memset(f,-0x3f,sizeof f);
memset(g,0x3f,sizeof g);
int minn=INF,maxx=-INF;
for(int len=1;len<=n;len++)
for(int l=1,r;r=l+len-1,r<n*2;l++)
{
if(len==1)f[l][l]=g[l][l]=0;
else
{
for(int k=l;k<r;k++)
{
f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
g[l][r]=min(g[l][r],g[l][k]+g[k+1][r]+s[r]-s[l-1]);
}
}
}
for (int l = 1; l <= n; ++ l)
{
maxx = max(maxx, f[l][l + n - 1]);
minn = min(minn, g[l][l + n - 1]);
}
cout<<minn<<endl;
cout<<maxx<<endl;
return 0;
}