• 加分二叉树


    描述
    设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:
    subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数
    若某个子树为空,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。
    试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;
    (1)tree的最高加分
    (2)tree的前序遍历
    格式
    输入格式
    第1行:一个整数n(n<30),为节点个数。
    第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。
    输出格式
    第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。

    第2行:n个用空格隔开的整数,为该树的前序遍历。

    分析:这道题表面上是一道树形DP,事实上完全可以用区间DP解决。代码太简单,懒得写注释了。

    代码如下:

    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    
    const int low=-999999999;
    int n;
    int a[51]={0},f[51][51],root[51][51]={0};
    
    void front(int x,int y)
    {
        if (root[x][y]!=0) printf("%d ",root[x][y]);
        if (root[x][root[x][y]-1]!=0) front(x,root[x][y]-1);
        if (root[root[x][y]+1][y]!=0) front(root[x][y]+1,y);
    }
    
    int main()
    {
        scanf("%d",&n);
        for (int i=0; i<=n; i++)
          for (int j=0; j<=n; j++)
              f[i][j]=1;
    
        for  (int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            f[i][i]=a[i];
            root[i][i]=i;
        }
    
        for (int len=1; len<=n; len++)
        {
            for  (int i=1; i<=n; i++)
            {
                int j=i+len;
                if (j<=n)
                {
                    int mmax=low;
                    for (int k=i; k<=j; k++)
                    {
                        if (mmax<(f[i][k-1]*f[k+1][j]+a[k]))
                        {
                            mmax=f[i][k-1]*f[k+1][j]+a[k];
                            root[i][j]=k;
                        }
                    }
                    f[i][j]=mmax;
                }
            }
        }
        printf("%d
    ",f[1][n]);
        front(1,n);
        system("pause");
        return 0;
    }
    View Code

     

  • 相关阅读:
    JSP界面之间如何实现传值
    绝对路径的用法
    每日日报2020.8.12 1905
    每日日报2020.8.8 1905
    每日日报2020.8.17 1905
    每日日报2020.8.15 1905
    每日日报2020.8.13 1905
    每日日报2020.8.10 1905
    每日日报2020.8.16 1905
    每日日报2020.8.9 1905
  • 原文地址:https://www.cnblogs.com/Shymuel/p/4393149.html
Copyright © 2020-2023  润新知