看到这道题的第一反应是用区间dp,可是对于如何构造环以及更简单推出dp遇到困难,最后参考了洛谷题解第一的代码,在输入时就构造存放sum的数组。主程序中适用了三重循环,在数据量小时还是适用的,不知道还有没有其他的优化算法。
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n,minl,maxl,f1[300][300],f2[300][300],num[300];
int s[300];
int d(int i,int j){
return s[j]-s[i-1];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
num[i+n]=num[i];//模拟成一个圈
}
for(int i=1;i<=n+n;i++)
s[i]=s[i-1]+num[i];
for(int p=1;p<n;p++)
{
for(int i=1;i+p<=n+n;i++)
{
int j=i+p;
f2[i][j]=INF;
for(int k=i;k<j;k++)
{
f1[i][j] = max(f1[i][j], f1[i][k]+f1[k+1][j]+d(i,j));
f2[i][j] = min(f2[i][j], f2[i][k]+f2[k+1][j]+d(i,j));
}
}
}
minl=INF;
for(int i=1;i<=n;i++)
{
maxl=max(maxl,f1[i][i+n-1]);
minl=min(minl,f2[i][i+n-1]);
}
printf("%d\n%d",minl,maxl);
return 0;
}