比赛 动规 评测结果 AAAAAAA
题目名称 加分二叉树 最终得分 100
用户昵称 Hyoi_0Koto 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2017-06-18 21:27:41
显示代码纯文本
#include<cstdio>
#include<cctype>
using namespace std;
typedef long long ll;
const int maxn=33;
int n,w[maxn],r[maxn][maxn];
ll f[maxn][maxn];
inline void in(int &x){
    x=0;int f=1;char t=getchar();
    while(!isdigit(t)){if(t=='-')f=-1;t=getchar();}
    while(isdigit(t)){x=x*10+t-48;t=getchar();}
    x*=f;
}
inline int dfs(int u,int v){
	f[u][v]=1;
	if(u<v){
		for(int i=u;i<=v;i++){
			int x=f[u][i-1];int y=f[i+1][v];
			if(!x){
				if(u<=i-1) x=dfs(u,i-1);
				else x=1;
			}
			if(!y){
				if(i+1<=v) y=dfs(i+1,v);
				else y=1;
			}
			if(f[u][v]<x*y+w[i]){
				f[u][v]=x*y+w[i];
				r[u][v]=i;
			}
		}
	}
	else{
		f[u][v]=w[u];r[u][v]=u;
	}
	return f[u][v];
}
inline void print(int u,int v)
{
	if(r[u][v]) printf("%d ",r[u][v]);
	if(r[u][v]) print(u,r[u][v]-1);
	if(r[u][v]) print(r[u][v]+1,v);
}
int mian(){
	freopen("jfecs.in","r",stdin);
	freopen("jfecs.out","w",stdout);
	in(n);
	for(int i=1;i<=n;i++) in(w[i]);
	dfs(1,n);
	printf("%d\n",f[1][n]);
	print(1,n);
}
int miku=mian();
int main(){;}