比赛 2025暑期集训第4场 评测结果 AAAAAAA
题目名称 加分二叉树 最终得分 100
用户昵称 ChenBp 运行时间 0.018 s
代码语言 C++ 内存使用 3.72 MiB
提交时间 2025-07-05 09:51:44
显示代码纯文本
#include <iostream>
#include <algorithm>
#include <cstdio>
#define ll long long
using namespace std;
int n;
int fs[35];
ll f[35][35];
int rt[35][35];
ll dfs(int l,int r){//cout<<l<<" "<<r<<endl;
	if(l>r) return 1;
	if(l==r){
		return fs[l];
	}
	if(f[l][r]) return f[l][r];
//	f[l][r]=max(dfs(l+1,r)+fs[l],dfs(l,r-1)+fs[r]);
//	for(int i=l+1;i<=r-1;i++){
//		f[l][r]=max(f[l][r],dfs(l,i-1)*dfs(i+1,r)+fs[i]);
//	}
	int t;
	for(int i=l;i<=r;i++){
//		f[l][r]=max(f[l][r],dfs(l,i-1)*dfs(i+1,r)+fs[i]);=
		t=dfs(l,i-1)*dfs(i+1,r)+fs[i];
		if(t>f[l][r]){
			f[l][r]=t;
			rt[l][r]=i;
		}
	}
	return f[l][r];
}
void pr(int l,int r){
	if(l>r) return;
	if(l==r){
		cout<<l<<" ";
		return;
	}
	cout<<rt[l][r]<<" ";
	pr(l,rt[l][r]-1);
	pr(rt[l][r]+1,r);
}
int main(){
	freopen("jfecs.in","r",stdin); 
	freopen("jfecs.out","w",stdout); 
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>fs[i];
	}
	cout<<dfs(1,n)<<endl;
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++){
//			cout<<rt[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	pr(1,n);
	return 0;
}