看不懂题目,直接去看题解了,慢慢琢磨还是不太懂题目的意思,但是能看得懂代码的操作。(好像是遍历各个支点作为根时分数的最大值,然后保存为根 )
#include <cstdio>
int n,first=1;
long long f[50][50],root[50][50];
long long search(int l,int r)
{
int k;
long long now;
if(l>r) return 1;
if(f[l][r]==-1)
for(k=l;k<=r;k++)
{
now=search(l,k-1)*search(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(first) first=0;
else printf(" ");
printf("%lld",root[l][r]);
preorder(l,root[l][r]-1);
preorder(root[l][r]+1,r);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=-1;
for(int i=1;i<=n;i++)
{
scanf("%lld",&f[i][i]);
root[i][i]=i;
}
printf("%lld\n",search(1,n));
preorder(1,n);
return 0;
}