这道题还挺有意思的,题目描述是中文的还挺好理解的,做一遍这道题对于树状记忆化搜索的帮助下还挺大的
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[35][35];
int root[35][35];
int n,flag=0;
long long searchtree(int l,int r)
{
if(f[l][r]!=-1) return f[l][r];
if(l>r) return 1;
int k;
long long now;
for(k=l;k<=r;k++)
{
now=searchtree(l,k-1)*searchtree(k+1,r)+f[k][k];
if(now>f[l][r]){
f[l][r]=now;
root[l][r]=k;
}
}
return f[l][r];
}
void preorder(int l,int r)
{
if(l>r) return;
if(flag==1)
printf(" ");
else flag=1;
int w=root[l][r];
printf("%d",w);
preorder(l,w-1);
preorder(w+1,r);
}
int main()
{
scanf("%d",&n);
memset(f,-1,sizeof(f));
for(int i=1;i<=n;i++){
scanf("%d",&f[i][i]);
root[i][i]=i;
}
printf("%lld\n",searchtree(1,n));
preorder(1,n);
return 0;
}