luogu_P1040 [NOIP2003 提高组] 加分二叉树

P1040 [NOIP2003 提高组] 加分二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:给你一颗中序遍历为1到n的二叉树,和每个节点的val。树的值=左子树的值×右子树的值+根的val,空树值为1,求整个树最大值和这个值树的前序遍历。

题解:区间dp。dp[l][r]表示最大值,root[l][r]表示最大值的根,枚举区间然后枚举根,根据题目中的计算公式搞最大值。

  树形dp。一样的dp[l][r]表示子树罢了。

  多想想,一步步讨论就好了,关键是找能做出答案的状态表示再想转移方程。

int n,a[N],dp[N][N],rt[N][N];
void pre_ans(int l,int r){
    if(l>r) return;
    cout<<rt[l][r]<<" ";
    pre_ans(l,rt[l][r]-1);
    pre_ans(rt[l][r]+1,r);
}
void solve(){
    cin>>n;
    rep(i,1,n+1) cin>>a[i],dp[i][i]=a[i],rt[i][i]=i;
    for(int len=1;len<=n;len++){
        for(int l=1;l+len-1<=n;l++){
            int r = l+len-1;
            dp[l][r] = dp[l + 1][r] + dp[l][l];//左子树为空
            rt[l][r]=l;
            for(int k=l+1;k<r;k++){//左子树的节点数  枚举子树的根
                if(dp[l][r]<dp[l][k-1]*dp[k+1][r]+dp[k][k]){
                    dp[l][r]=dp[l][k-1]*dp[k+1][r]+dp[k][k];
                    rt[l][r]=k;
                }
            }
            if(dp[l][r]<dp[l][r-1]+dp[r][r]){
                dp[l][r]=dp[l][r-1]+dp[r][r];
                rt[l][r]=r;
            }
        }
    }
//    for(int len=1;len<=n;len++){
//        printf("len=%d\n",len);
//        for(int l=1;l+len-1<=n;l++){
//            int r = l+len-1;
//            printf("dp[%d][%d]=%d ",l ,r ,dp[l][r]);
//        }
//        printf("\n");
//    }
    cout<<dp[1][n]<<"\n";
    pre_ans(1,n);
}

原文链接:https://www.cnblogs.com/leexiao/p/17358940.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:luogu_P1040 [NOIP2003 提高组] 加分二叉树 - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • 【Visual Leak Detector】使用注意事项

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍使用 VLD 时的注意事项。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 官网文档 2. 注意事项 1. 官网文档 可以在 Using-Visual-Leak-Detector 官方文档里看到如何使用 VLD,里面介绍了如何在 Visual C++ 2003/2005/2…

    C++ 2023年4月17日
    00
  • C++/Qt网络通讯模块设计与实现(总结)

    至此,C++/Qt网络通讯模块设计与实现已分析完毕,代码已应用于实际产品中。 C++/Qt网络通讯模块设计与实现(一) 该章节从模块的功能需求以及非功能需求进行分析,即网络通讯模块负责网络数据包的发送、接收以及对外提供功能调用以及接口回调,其不进行产品业务的实现,达到平台化复用的目的,给出了类图,如下所示::   符合先设计再开发的思想,各类的功能也有详细描…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】源码编译 VLD 库

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 源码的编译。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. VLD 库的依赖文件 2. 源码编译生成 VLD 库 3. 配置环境变量 4. 使用 VLD 库 1. VLD 库的依赖文件 以 vld2.5.1 版本为例,下载源码 后,源码包中各文件的用途可看本人另一…

    C++ 2023年4月24日
    00
  • LeetCode 力扣 205. 同构字符串

    给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。 示例 1: 输入:s = “egg”, t = “add”输出:true示例…

    C++ 2023年4月18日
    00
  • STL容器之queue

    是什么 循环队列, FIFO先进先出 怎么用 初始化 //C11 deque<int> deq{1,2,3,4,5}; //拷贝构造,可以拷贝deque queue<int> que(deq); //100个5 queue<int> que2(100,5); //运算符重载 que2 = que; 操作 //队尾添加元素 …

    C++ 2023年4月17日
    00
  • QML和QT

    推荐一些学习qml教程 Qt官方的QML教程: https://doc.qt.io/qt-5/qtqml-index.html这是一个由Qt官方提供的完整的QML教程,包含了所有基本知识和高级语法。 QML中文网:http://www.qmlcn.com/这是一个非常不错的中文QML学习网站,提供了丰富的例子和教程,而且有很多QML爱好者在这里交流。 《Qt…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】库的 22 个 API 使用说明

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇主要介绍 VLD 库提供的 22 个外部接口。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 头文件简介 2. 文件 vld_def.h 简介 3. 文件 vld.h 简介 3.1 接口 VLDDisable 3.2 接口 VLDEnable 3.3 接口 VLDRestore…

    C++ 2023年4月17日
    00
  • 【Visual Leak Detector】配置项 TraceInternalFrames

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 TraceInternalFrames 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否跟踪内部堆栈的调用 2.1 测试代码 2.2 TraceInternalFrames = no 时的输出 2.3 …

    C++ 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部