大佬求助!!!min值出了问题(蒟蒻想哭)
查看原帖
大佬求助!!!min值出了问题(蒟蒻想哭)
307826
Lamorak楼主2020/10/25 13:07
#include<bits/stdc++.h>
using namespace std;
int n,f1[150][150],f2[150][150],a[150],b[150][150];
//f1,f2表示从i合并到j的最优值(f1是最大,f2是最小) 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		a[i+n]=a[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=i;j<=i+n-1;j++){
			for(int k=i;k<=j;k++){
				b[i][j]+=a[k];//预处理,表示i->j的合并值 
			}
		}
	}
	memset(f2,0x3f,sizeof(f2));
	for(int i=1;i<=n;i++){
		f2[i][i]=0;
	}
	for(int i=2;i<=n;i++){
		for(int j=1;j<=n;j++){
			int end=i+j-1;
			for(int k=j;k<end;k++){
				f1[j][end]=max(f1[j][k]+f1[k+1][end]+b[j][end],f1[j][end]);
				f2[j][end]=min(f2[j][k]+f2[k+1][end]+b[j][end],f2[j][end]);
			}
		}
	}
	int minn=1e9,maxx=-1;
	for(int i=1;i<=n;i++){
		minn=min(f2[i][i+n-1],minn);
		maxx=max(f1[i][i+n-1],maxx);
	}
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n+n;j++){
//			printf("%d ",f2[i][j]);
//		}printf("\n");
//	}
	printf("%d\n%d",minn,maxx);
	return 0;
}
//max值处理好了,就是min值出了问题
//查询了f2的值,这样赋值做不了环形的: 
//0 9 27 44 0x3f 0x3f 0x3f 0x3f
//0x3f 0 14 31 0x3f 0x3f 0x3f
//0x3f 0x3f 0 13 0x3f 0x3f 0x3f 0x3f
//0x3f 0x3f 0x3f 0 0x3f 0x3f 0x3f 0x3f
2020/10/25 13:07
加载中...