** 2058 - 石子合并(环形)---区间dp
** 来源: 东方博宜oj oj.czos.cn
#include<bits/stdc++.h>
using namespace std;
const int N=410;
int ma[N*2][N*2],mi[N*2][N*2];
int a[N*2],s[N*2];
int n;
int main()
{
cin>>n;
//初始化
memset(mi,0x3f,sizeof(mi));
memset(ma,-0x3f,sizeof(ma));
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];
//初始化
mi[i][i]=0;
ma[i][i]=0;
}
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n*2;i++)
{
int j=i+len-1;
for(int k=i;k<j;k++)
{
mi[i][j]=min(mi[i][j],mi[i][k]+mi[k+1][j]+s[j]-s[i-1]);
ma[i][j]=max(ma[i][j],ma[i][k]+ma[k+1][j]+s[j]-s[i-1]);
}
}
}
//穷举所有可能的出发点,求最小,最大
int maxn=INT_MIN,minn=INT_MAX;
for(int i=1;i<=n;i++)
{
minn=min(minn,mi[i][i+n-1]);
maxn=max(maxn,ma[i][i+n-1]);
}
cout<< minn<< endl<< maxn;
return 0;
}
2058 - 石子合并(环形)---区间dp
最新推荐文章于 2024-08-10 07:14:43 发布