比赛 动规 评测结果 AAAAAAA
题目名称 加分二叉树 最终得分 100
用户昵称 Emine 运行时间 0.002 s
代码语言 C++ 内存使用 0.43 MiB
提交时间 2017-06-18 20:55:02
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
 
int n;
long long f[101][101];
int num[101][101];
/*f[i][j]为i到j的最大值,num[i][j]表示i到j的最大值的节点*/
 
void find(int x,int y){
    if(x<=y){
        printf("%d ",num[x][y]);
        find(x,num[x][y]-1);
        find(num[x][y]+1,y);
    }
    return;
}
 
int main(){
	freopen("jfecs.in","r",stdin);
	freopen("jfecs.out","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
            f[i][j]=1,num[i][i]=i;  //初始化
    for(int i=1;i<=n;i++)
        scanf("%d",&f[i][i]);
    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][j]<(f[i][k-1]*f[k+1][j]+f[k][k])){
                    f[i][j]=f[i][k-1]*f[k+1][j]+f[k][k];
                    num[i][j]=k;
                }
            }
    printf("%lld\n",f[1][n]);
    find(1,n);
}