zoukankan      html  css  js  c++  java
  • VijosP1100:加分二叉树

    描述

    设一个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个用空格隔开的整数,为该树的前序遍历。

    输入:

    5
    5 7 1 2 10

    输出:

    145
    3 1 2 4 5

    树形DP

    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int MAXN=50;
    int dp[MAXN][MAXN];
    int path[MAXN][MAXN];
    int val[MAXN];
    int n;
    int dfs(int left,int right)
    {
        if(left>right)
            return 1;
        if(left==right)
        {
            path[left][right]=left;
            return val[left];
        }
        if(dp[left][right]>0)
            return dp[left][right];
        int root;
        int res=dp[left][right];
        for(int mid=left;mid<=right;mid++)
        {
            int tmp=dfs(left,mid-1)*dfs(mid+1,right)+val[mid];
            if(tmp>res)
            {
                res=tmp;
                root=mid;
            }
        }
        path[left][right]=root;
        return dp[left][right]=res;
    }
    void pre_order(int left,int right)
    {
        if(left>right)
            return ;
        int mid=(path[left][right]);
        printf("%d ",mid+1);
        pre_order(left,mid-1);
        pre_order(mid+1,right);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&val[i]);
        }
        printf("%d
    ",dfs(0,n-1));
        pre_order(0,n-1);
        return 0;
    }
  • 相关阅读:
    sql优化
    mysql_存储过程_后一行减去前一行
    python基础笔记
    atom使用markdown
    tensorboard遇到的坑
    WordPaster-Firefox浏览器控件安装方法
    WordPaster.exe安装教程
    Web大文件上传控件-bug修复-Xproer.HttpUploader6
    Web大文件下载控件更新-Xproer.HttpDownloader
    Web大文件上传控件-asp.net-bug修复-Xproer.HttpUploader6.2
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5396994.html
Copyright © 2011-2022 走看看