1 solutions

  • 1
    @ 2024-3-2 15:44:19
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=50;
    LL w[N],f[N][N],g[N][N];
    void dfs(int l,int r)
    {
         
        if(l>r) //没有节点 
        {
            return ;
        }
        int k=g[l][r]; //当前根 
        cout<<k<<" ";
        dfs(l,k-1); //左子树 
        dfs(k+1,r); //右子树 
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>w[i];
        for(int len=1;len<=n;len++) //长度 
        {
            for(int l=1;l<=n;l++) //左端点 
            {
                int r=l+len-1; //右端点 
                if(l==r) //叶子节点 
                {
                    f[l][r]=w[l];
                    g[l][r]=l;
                }
                else
                {
                    for(int k=l;k<=r;k++) //枚举根 
                    {
                        LL left=1,right=1; //左右 
                        if(k!=l) left=f[l][k-1];
                        if(k!=r) right=f[k+1][r];
                        LL s=left*right+w[k]; //计算和 
                        if(s>f[l][r]) //更新 
                        {
                            f[l][r]=s;
                            g[l][r]=k;
                        }
                    }
                }
            }
        }
        cout<<f[1][n]<<endl;
        dfs(1,n);
        return 0;
    }
    
    • 1

    Information

    ID
    999
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    7
    Tags
    (None)
    # Submissions
    14
    Accepted
    4
    Uploaded By