#include <bits/stdc++.h>
using namespace std;
const int Max=35;
int n,m;
int f[Max][Max],root[Max][Max],num[Max];
inline void print(int l,int r)
{
cout<<root[l][r]<<" ";
if(root[l][r]>l) print(l,root[l][r]-1);
if(root[l][r]<r) print(root[l][r]+1,r);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
f[i][i]=num[i],root[i][i]=i,f[i][i-1]=f[i+1][i]=1;
}
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
for(int k=i;k<=j;k++)
{
if(f[i][k-1]*f[k+1][j]+f[k][k] <= f[i][j]) continue;
f[i][j]=max(f[i][j],f[i][k-1]*f[k+1][j]+f[k][k]);
root[i][j]=k;
}
cout<<f[1][n]<<"\n";
print(1,n);
return 0;
}
【NOIP2003提高组】加分二叉树
最新推荐文章于 2023-11-23 21:34:48 发布