记录编号 241664 评测结果 AAAAAAA
题目名称 [HZOI 2014] 合并石子 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.017 s
提交时间 2016-03-26 08:07:36 内存使用 0.39 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
const int maxn=105;
int s[maxn*2],sum[maxn*2];
int f[maxn*2][maxn*2];
int n,n2;
int low(int a,int b){
	return a<b?a:b;
}
int high(int a,int b){
	return a>b?a:b;
}
int dp(int cmp(int,int),int init){
	memset(f,init,sizeof(f));
	for(int i=1;i<=n2;++i)f[i][i]=0;
	for(int k=1;k<n;++k){//枚举“区间长度-1” 
		for(int i=1;i+k<=n2;++i)//i+k:区间终点 
		{
			int j=i+k;
			for(int p=i;p<j;++p){
				f[i][j]=cmp(f[i][j],f[i][p]+f[p+1][j]+sum[j]-sum[i-1]);
//			if(init==127)printf("f[%d][%d]cmp(f[%d][%d]+f[%d][%d]+s[%d]-s[%d]))==%d\n",i,j,i,p,p+1,j,j,i-1,f[i][j]);
			}
		}
	}
	int ans=(init==0)?0:1<<25;
	for(int i=1;i+n-1<=n2;++i)ans=cmp(ans,f[i][i+n-1]);
	return ans;
}
int main(){
	freopen("stone2.in","r",stdin);
	freopen("stone2.out","w",stdout);
	scanf("%d",&n);n2=n*2;
	for(int i=1;i<=n;++i){
		scanf("%d",s+i);
		sum[i]=sum[i-1]+s[i];
	}
	for(int i=n+1;i<=n2;++i){
		s[i]=s[i-n];
		sum[i]=sum[i-1]+s[i];
	}
//	for(int i=0;i<=n;++i)printf("%d ",sum[i]);
//	printf("\n");
	printf("%d\n%d\n",dp(low,127),dp(high,0));
/*	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j)printf("%d ",f[i][j]);
		printf("\n");
	}*/
	fclose(stdin);fclose(stdout);
	return 0;
}
/*
8
66 88 180 175 111 151 51 3

ans:
2294
4561
*/