#include<iostream>
#include<cstdio>
using namespace std;
int n;
int a[35],dp[35][35],rt[35][35];
int dfs(int l,int r){
if(dp[l][r])return dp[l][r];
if(l>r)return 1;
if(l==r)return a[l];
int res=0,root=0,tp=0;
for(int i=l;i<=r;i++){
tp=dfs(i+1,r)*dfs(l,i-1)+a[i];
if(tp>res)res=tp,root=i;
}
dp[l][r]=res;
rt[l][r]=root;
return res;
}
void print(int l,int r){
if(l>r)return;
if(l==r){
cout<<l<<" ";return;
}
cout<<rt[l][r]<<" ";
print(l,rt[l][r]-1);
print(rt[l][r]+1,r);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cout<<dfs(1,n)<<endl;
print(1,n);
}
深度优先搜索—luogu1040加分二叉树
最新推荐文章于 2023-06-08 16:42:42 发布