社区讨论

大佬求助!!!min值出了问题(蒟蒻想哭)

P1880[NOI1995] 石子合并参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lod2cwn0
此快照首次捕获于
2023/10/30 23:37
2 年前
此快照最后确认于
2023/11/05 09:55
2 年前
查看原帖
CPP
#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

回复

3 条回复,欢迎继续交流。

正在加载回复...