1 条题解

  • 1
    @ 2022-07-14 20:50:14
    #include<bits/stdc++.h>
    using namespace std;
    int a[35],ans[35],root[35][35];
    int n,len=0;
    long long f[35][35];
    long long now;
    long long dfs(int l,int r)
    {
        if(f[l][r]!=-1)
            return f[l][r];
        for(int k=l; k<=r; k++)
        {
            now=dfs(l,k-1)*dfs(k+1,r)+a[k];
            if(now>f[l][r])
            {
                f[l][r]=now;
                root[l][r]=k;
            }
        }
        return f[l][r];
    }
    void print(int l,int r)
    {
        if(l>r)
            return;
        cout<<root[l][r]<<" ";
        print(l,root[l][r]-1);
        print(root[l][r]+1,r);
    }
    int main()
    {
        memset(f,-1,sizeof(f));
        cin>>n;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
            f[i][i]=a[i];
            root[i][i]=i;
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<i; j++)
            {
                f[i][j]=1;
                root[i][j]=-1;
            }
        }
        cout<<dfs(1,n)<<endl;
        print(1,n);
        return 0;
    }
    
  • 1

[NOIP2003 提高组] 加分二叉树

信息

ID
1301
难度
7
分类
(无)
标签
递交数
7
已通过
1
通过率
14%
上传者