我在测样例和手造的数据的时候,发现求最小值没错,最大值总是多了一倍,就直接最大值除2交了一发,然后,就过了。。所以这是为什么呢?
#include<bits/stdc++.h>
using namespace std;
int a[201],s[201],f[201][201],p[201][201];
int main()
{
int n,minn=1e9,maxx=-1e9;
scanf("%d",&n);memset(p,0x3f,sizeof(p));
for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i+n]=a[i];
for(int i=1;i<=(n<<1);i++) s[i]=s[i-1]+a[i],f[i][i]=p[i][i]=0;
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=(n<<1);i++)
{
int j=i+len-1;
for(int k=i;k<=j;k++)
{
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
p[i][j]=min(p[i][j],p[i][k]+p[k+1][j]+s[j]-s[i-1]);
}
}
}
for(int i=1;i<=n;i++)
{
minn=min(p[i][i+n-1],minn);
maxx=max(f[i][i+n-1],maxx);
}
printf("%d\n%d",minn,maxx>>1);
return 0;
}