记录编号 105944 评测结果 AAAAA
题目名称 石子合并(加强版) 最终得分 100
用户昵称 Gravatar好坑呀 是否通过 通过
代码语言 C++ 运行时间 0.338 s
提交时间 2014-06-12 20:18:37 内存使用 122.46 MiB
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cstdio> 
#define h 4001
using namespace std;
int f_max[h][h];
int n,sum[h][h];
int a[h]={0};
void work();
int main()
{
	freopen("stone3.in","r",stdin);
	freopen("stone3.out","w",stdout);
	cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
		a[i+n]=a[i];//变成链状,像破碎的项链一样复制一遍。。 
	}
	for(int i=1;i<=2*n;i++)
	{
		int tot=a[i];
		for(int j=i+1;j<=2*n;j++)
		{
			tot+=a[j];
			sum[i][j]=tot;
		}
	}
	work();
	return 0;
}
void work()
{
	for(int d=2;d<=2*n;d++)
	{
		for(int i=1;i<=2*n-d+1;i++)
		{
			int j=i+d-1;
			f_max[i][j]=max(f_max[i+1][j],f_max[i][j-1]);//问老师  老师说去找数奥的 
			f_max[i][j]+=sum[i][j];
		}
	}
	int tot1=0x7f7f7f7f,tot2=0;//分别断开找最大最小。。。 不能像石子合并一 一样直接输出f[1][n] 
	for(int i=1;i<=n;i++)
	{
		if(f_max[i][i+n-1]>tot2) tot2=f_max[i][i+n-1];
	}
	cout<<tot2<<endl;
}