洛谷题目链接:加分二叉树

题目描述

设一个n个节点的二叉树tree的中序遍历为(1,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个用空格隔开的整数,为该树的前序遍历。

输入输出样例

输入样例#1:

5
5 7 1 2 10

输出样例#1:

145
3 1 2 4 5

一句话题意: 给出一个颗树,规定了它的中序遍历结果为\(1\)到\(n\),选定一个下标为\(i\)的元素,得到的价值为\(val_{(1,i-1)}*val_{(i+1,n)}+w_i\).问总共可以得到的最大价值(可以好好想一想这个计算过程是为什么).

题解: 仔细想一下题意,会发现这东西和树并没有什么关系.显然我们可以根据这个计算价值的方式直接递归求解.

然而这样的复杂度是\(O(n!)\)的,所以我们需要考虑一下优化.

我们可以在递归过程中加一个记忆化,同时在更新的时候也记录一下这个区间的选定的点.

最后记得要开long long.

#include<bits/stdc++.h>
using namespace std;
const int N=30+5;
const int inf=2147483647;
typedef long long lol;lol n, a[N], pre[N][N], f[N][N];lol solve(lol l,lol r){//递归求解过程lol res = -inf, temp;if(f[l][r]) return f[l][r];//记忆化if(l > r) return 1;if(l == r) return a[l];for(lol i=l;i<=r;i++){temp = solve(l,i-1)*solve(i+1,r)+a[i];if(temp > res) res = temp, pre[l][r] = i;//取最大值,并记录区间选定点.}return f[l][r] = res;
}void out(lol l,lol r){if(l > r) return;if(l == r){ printf("%lld ",l); return;}printf("%lld ",pre[l][r]);out(l,pre[l][r]-1);out(pre[l][r]+1,r);
}int main(){//freopen("data.in","r",stdin);cin >> n;for(lol i=1;i<=n;i++) cin >> a[i];printf("%lld\n",solve(1,n));out(1,n); printf("\n");return 0;
}

转载于:https://www.cnblogs.com/BCOI/p/9000114.html

[洛谷P1040] 加分二叉树相关推荐

  1. 洛谷P1040 加分二叉树运用区间DP(动态规划)求解

    首先放上原题链接 点我,点我进入原题 什么是动态规划? 在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.而且每次求出的解不是独立的,我们需要逐层推出最优解. 以这 ...

  2. 加分二叉树(洛谷-P1040)

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  3. P1040 加分二叉树【dp+深搜】

    题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,-,n1,2,3,-,n),其中数字1,2,3,-,n1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...

  4. 洛谷——P1305 新二叉树(新建二叉树以及遍历)

    题目描述 输入一串二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 ...

  5. 洛谷P1040-加分二叉树-dp+二叉树

    P1040-加分二叉树 这道题放在深度优先搜索的训练题中,可是我实在没有看出来应该怎么搜索.看了题解以后才看出来是一个很简单的dp(我果然还是太菜了) 看出dp并且算出来最大的分数不是很复杂,关键是输 ...

  6. 对于洛谷提高试炼场-动态规划篇的爆破

    题外话 由于本蒟蒻的动态规划实在是太弱啦,所以有必要爆破一下洛谷提高试炼场.里面有很多非常好,难度也合适的动态规划题--(然而你还是抄了不少题解) niconiconi~让我们一起开始爆破吧. lv- ...

  7. 加分二叉树 java_P1040 加分二叉树

    P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...

  8. 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树

    [题目链接] ybt 1981:[18NOIP普及组]对称二叉树 洛谷 P5018[NOIP2018 普及组] 对称二叉树 [题目考点] 二叉树 [解题思路] 先求出二叉树中各子树的结点数 遍历二叉树 ...

  9. 二叉树——二叉树问题(洛谷 P3884)

    题目选自洛谷P3884 ** 解题思路** 经过剖析样例,我微微思索手动模拟后发现 要找最近的公共祖先,一次次地向上找就好了嘛,其实这有点并查集地意思 寻找时可分为两种情况 1.两点在不同子树中,有公 ...

最新文章

  1. KVM(CentOS7.2)
  2. 区块链BaaS云服务(39)时戳信息Bystack“架构“
  3. 15、如何选择MySQL存储引擎
  4. XII Open Cup named after E.V. Pankratiev. GP of Eastern Europe (AMPPZ-2012)
  5. JFinal针对ORACLE的timestamp字段解决办法
  6. 七月老师python_七月在线Python学习笔记
  7. FAT磁盘分配策略简说
  8. XML Schema快速入门(三)语法之复杂类型
  9. 好奇心是怎么驱动成功的
  10. sketch插件 android,Sketch 插件大集合
  11. 怎样设置txt的默认打开方式(比如用nodePad++)
  12. python最少钞票_钞票最少张数
  13. Spark 基础知识
  14. 正则表达式常用语法速查+一个简单使用案例
  15. smart-sso单点登录(三):App登录支持
  16. Kubernetes web界面kubernetes-dashboard安装
  17. 评选最牛群主v1.0(哈工大Mooc)
  18. eclipse不进入断点_eclipse断点不起作用怎么办?
  19. 手机和电脑数据恢复,粉碎删除,电脑恢复文件教程
  20. js奇淫巧计--常用总结

热门文章

  1. Java堆排序递归_大顶堆第二弹----堆排序(递归实现)
  2. ajax跨域时使得后台的sessionid不断地的变化,以及layui表格支持跨域的方法,java
  3. 机器学习物语(1):世界观设定
  4. All is about C!
  5. 机器如何区分和判定指令和数据
  6. 整理记录word2016小技巧,自用
  7. win7系统硬盘安装centos7(easyBCD)
  8. 3分钟了解带参数的main函数
  9. AbstractListView源码分析4
  10. php function split is deprecated,如何解决php Function split() is deprecated 的问题