zoukankan      html  css  js  c++  java
  • TYVJ P1073 加分二叉树 Label:区间dp

    背景

    NOIP2003 提高组 第三道

    描述

    设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为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个用空格隔开的整数,为该树的前序遍历。

    测试样例1

    输入


    5 7 1 2 10

    输出

    145 
    3 1 2 4 5

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int N,f[35][35],p[35][35],v[35];
    
    void print(int l,int r){
        printf("%d ",p[l][r]);
        if(l<=p[l][r]-1) print( l          ,p[l][r]-1);
        if(p[l][r]+1<=r) print( p[l][r]+1  ,r        );
    }
    
    int dp(int l,int r){
        if(l>r) return 1;
        if(l==r){
            p[l][r]=l;
            return v[l];
        }
        if(f[l][r]>=0) return f[l][r];
        
        for(int k=l;k<=r;k++){
            if(dp(l,k-1)*dp(k+1,r)+v[k]>f[l][r]){
                f[l][r]=dp(l,k-1)*dp(k+1,r)+v[k];
                p[l][r]=k;
            }
        }
        return f[l][r];
    }
    
    int main(){
    //  freopen("01.txt","r",stdin);
        memset(f,-1,sizeof(f));
        scanf("%d",&N);
        for(int i=1;i<=N;i++) scanf("%d",&v[i]);
        
        printf("%d
    ",dp(1,N));
        print(1,N);
        puts(" ");
        
        return 0;
        
    }

    额,这一题耗了我很久时间,原因是二叉树问题没搞懂:

    不懂的童鞋看这里:二叉树遍历入门之入门(http://www.cnblogs.com/radiumlrb/p/5790331.html)

    刚写的

    差不多看完就知道这题怎么做的了!

    p数组记录路径,f记录当前子树根节点

    dp函数算最大值并记录路径

    print函数打印路径

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    使用logstash配置nginx和tomcat日志统一收集到一台日志服务器
    文章
    辣和辛的区别是什么?
    prometheus和zabbix的对比
    从零搭建Prometheus监控报警系统
    Adobe Flash Professional 制作定制FLashPlayer播放器之读取配置文件(二)
    Adobe Flash Professional 制作定制FLashPlayer播放器(一)
    OSG+VS2015 测试Demo
    OSG+VS2015 入门教程---环境搭建
    button的类型?为什么button 会自动提交表单?
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5790367.html
Copyright © 2011-2022 走看看