居然……
查看原帖
居然……
162151
Mingxuan楼主2022/8/24 22:21

我在测样例和手造的数据的时候,发现求最小值没错,最大值总是多了一倍,就直接最大值除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;
}
2022/8/24 22:21
加载中...