比赛 动规 评测结果 AAAAAAA
题目名称 加分二叉树 最终得分 100
用户昵称 TARDIS 运行时间 0.001 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2017-06-18 20:51:13
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int maxn=35;
int val[maxn],n;
int dp[maxn][maxn],root[maxn][maxn];
void in(){
	freopen("jfecs.in","r",stdin);
	freopen("jfecs.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d",&val[i]);
		dp[i][i]=val[i];
		root[i][i]=i;
	}
}
void deal(){
	for (int i=n;i;i--){
		for (int j=i+1;j<=n;j++){
			for (int k=i;k<=j;k++){
				if (!dp[i][k-1]) dp[i][k-1]=1;
				if (!dp[k+1][j]) dp[k+1][j]=1;
				if (dp[i][j]<dp[i][k-1]*dp[k+1][j]+val[k])
					dp[i][j]=dp[i][k-1]*dp[k+1][j]+val[k],root[i][j]=k;
			}
		}
	}
}
void print(int l,int r){
	if (l>r) return;
	if (root[l][r]) printf("%d ",root[l][r]);
	print(l,root[l][r]-1);
	print(root[l][r]+1,r);
}
int main(){
	in();
	deal();
	printf("%d\n",dp[1][n]);
	print(1,n);
}