石子归并

#include<cstdio>
#include<iostream>
#define maxn 0x7fffffff
using namespace std;
int n,sum[1003][1003],num[1003],fn[1003][1003],fx[1003][1003];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&num[i]);
		sum[i][1]=num[i];
		fn[i][1]=fx[i][1]=0;
	}
	for(int j=2;j<=n;j++)
		for(int i=1;i<=n;i++)
			sum[i][j]=sum[i%n+1][j-1]+num[i];
	for(int j=2;j<=n;j++){
		for(int i=1;i<=n;i++){
			int tmp=sum[i][j];
			fn[i][j]=maxn;
			fx[i][j]=-maxn;
			for(int k=1;k<=j-1;k++){
				int x=(i+k-1)%n+1;
				fn[i][j]=min(fn[i][k]+fn[x][j-k]+tmp,fn[i][j]);
				fx[i][j]=max(fx[i][k]+fn[x][j-k]+tmp,fx[i][j]);
			}
		}
	}int xans=-maxn,nans=maxn;
	for(int i=1;i<=n;i++)nans=min(nans,fn[i][n]),xans=max(xans,fx[i][n]);
	printf("%d\n%d\n",nans,xans);
	return 0;
}


posted @ 2016-04-10 12:18  keshuqi  阅读(173)  评论(0编辑  收藏  举报