计算加分方法如下:
左子树的加分×的右子树的加分+根的分数.
若某个子树为空,规定其加分为1.
叶子的加分就是叶节点本身的分数.
#include<bits/stdc++.h>
using namespace std;
int n,val[51],f[51][51],root[51][51];
int dfs(int l,int r){
if(f[l][r])return f[l][r];
if(l==r)return val[l];//叶节点的加分是本身
if(r<l)return 1;
for(int i=l;i<=r;i++){
int cnt=dfs(l,i-1)*dfs(i+1,r)+f[i][i];
//枚举i作为[l,r]这段序列的根,然后计算得分
if(cnt>f[l][r]){
f[l][r]=cnt;//更新最大值
root[l][r]=i;//同时更新根节点编号
}
}
return f[l][r];//记忆化
}
void print(int l,int r){//递归输出前序遍历
if(r<l)return;
if(l==r){printf("%d ",l);return;}
printf("%d ",root[l][r]);//根
print(l,root[l][r]-1);//根的左边
print(root[l][r]+1,r);//根的右边
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
f[i][i]=val[i];//叶结点的加分等于本身
}
printf("%d\n",dfs(1,n));
print(1,n);
return 0;
}
原文:https://www.cnblogs.com/PPXppx/p/10336149.html