比赛 2025暑期集训第4场 评测结果 AAAAAAA
题目名称 加分二叉树 最终得分 100
用户昵称 小福鑫 运行时间 0.020 s
代码语言 C++ 内存使用 3.67 MiB
提交时间 2025-07-05 10:19:13
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n,a[101],f[101][101],p[101][101];
void print(int l,int r){
    if(l>r){ 
        return;
    } 
    cout<<p[l][r]<<" ";
    if(l==r){
    	return;
	}
    print(l,p[l][r]-1);
    print(p[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>>a[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			f[i][j]=1;
		}
		f[i][i]=a[i],p[i][i]=i;
	}
    for(int len=2;len<=n;len++){
        for(int l=1,r=l+len-1;r<=n;l++,r++){
        	p[l][r]=l; 
        	f[l][r]=f[l+1][r]+f[l][l];
            for(int k=l;k<=r;k++){
            	p[l][r]=(f[l][k-1]*f[k+1][r]+a[k]>f[l][r])?k:p[l][r];
            	f[l][r]=max(f[l][r],f[l][k-1]*f[k+1][r]+a[k]);
            }
        }
    }
	cout<<f[1][n]<<endl;
	print(1,n);
}