题解 | #[NOIP2003]加分二叉树#

[NOIP2003]加分二叉树

https://ac.nowcoder.com/acm/problem/16681

#include<iostream>
using namespace std;
int n;
int p=0;
int tree[40];
int dp[40][40];
int root[40][40];
int a[40];
void built(int l ,int r)
{
    int at=l;
    dp[l][l]=a[l],dp[r][r]=a[r];
    if(l!=r) 
        for(int i=l;i<=r;i++) dp[l][r]+=a[i];
    for(int k=l;k<=r;k++)
    {
        int ll=dp[l][k-1],rr=dp[k+1][r];
       if(!dp[l][k]) ll=1;
        if(!dp[k][r]) rr=1;
       if(ll*rr+a[k]>dp[l][r])
       {
           dp[l][r]=ll*rr+a[k];
           at=k;
        }
      
    }
    root[l][r]=at;
    
    return ;
}
void find(int l,int r)
{
//     cout<<l<<" "<<r<<endl;
    if(l==r) 
    {
        tree[p]=l;
        return ;
    }
   
    int at=root[l][r];
    tree[p]=at;
    if(at-1>=l)
    {
        
    p++;
    find(l,at-1);
    }
    if(at+1<=r)
    {
        
    p++;
    find(at+1,r);
        }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j>=1;j--)
        {
            built(j,i);
//             cout<<j<<" "<<i<<" "<<dp[j][i]<<" "<<root[j][i]<<endl;
        }
//         cout<<"----"<<endl;
    }
//     for(int i=1;i<=n;i++)
//     {
//         for(int j=1;j<=i;j++)
//             cout<<dp[i][j]<<" ";
//         cout<<endl;
//     }

            
    cout<<dp[1][n]<<endl;
    find(1,n);
    for(int i=0;i<n;i++) cout<<tree[i]<<" ";
}
全部评论

相关推荐

今天 16:40
门头沟学院 Java
看到这一幕,本大学生心都碎了2
真的很糟糕:挖藕,让他知道什么叫便宜没好货
点赞 评论 收藏
分享
昨天 14:08
门头沟学院 Java
点赞 评论 收藏
分享
07-01 23:23
郑州大学 Java
否极泰来来来来:牛客迟早有高三的
点赞 评论 收藏
分享
不多说了,看图吧
MomonKa:实际上是,机房机器有些高度,问问你身高,有没有女朋友是看你能不能猛猛加班
你最讨厌面试问你什么?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务