记录编号 403579 评测结果 AAAAAAA
题目名称 [NOIP 2003]加分二叉树 最终得分 100
用户昵称 GravatarzChengYuan 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2017-05-10 19:16:45 内存使用 0.32 MiB
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <vector>
#define maxn 31
using namespace std;
ifstream fin("jfecs.in");
ofstream fout("jfecs.out");
long f[maxn][maxn];
int node[maxn][maxn];
int di[maxn],n;
vector<int> res;
long dp(int i,int j);
void init();
void pre_order(int i,int j);
int main()
{
	init();
	fout<<dp(1,n)<<endl;
	pre_order(1,n);
	fout<<endl;
}
void init()
{
	fin>>n;
	for(int i=1;i<=n;++i)
	{
		fin>>di[i];
		node[i][i]=i;
	}
}
long dp(int i,int j)
{
	long &ans=f[i][j];
	if(ans>0)return ans;
	if(i==j)return ans=di[i];
	ans=1;
	for(int m=i;m<=j;++m)
	{
		long tmp=dp(i,m-1)*dp(m+1,j)+di[m];
		if(tmp>ans)
		{
			ans=tmp;
			node[i][j]=m;
		}
	}
	return ans;
}
void pre_order(int i,int j)
{
	int m=node[i][j];
	fout<<m<<' ';
	if(i<m)pre_order(i,m-1);
	if(j>m)pre_order(m+1,j);
}