问题 b: 【树型DP】加分二叉树

时间限制: 1 Sec  内存限制: 64 MB
提交: 8  解决: 6
[提交] [状态] [讨论版] [命题人:admin]

题目描述

科技忽略了过程就是魔法,魔法展示了过程就是科技。例如,在魔法世界彪炳史册的艾萨克·牛顿爵士,就被称为“最初的科学家,最后的炼金术士”。魔法世界的所谓魔法,其本质就是科技,只不过因为在远古时代发生的几次战乱,导致相当数量尖端科技理论的遗失和残缺,使得人们只知道如何使用科技却无法解释其原理,只好统称为魔法而已。所以魔法世界的科技树在宇宙各种文明的发展中,可以抽象的看成一颗奇怪的具有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行:一个整数,为最高加分(结果不会超过4000 000 000)。 第2行:n个用空格隔开的整数,为该树的前序遍历。(行尾有一个空格)

样例输入

复制样例数据

10
5 4 8 9 19 2 1 40 20 22

样例输出

839701
7 4 2 1 3 5 6 9 8 10
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i <= (b); ++ i)
#define REP(j, a, b) for(int j = (a); j <= (b); ++ j)
#define PER(i, a, b) for(int i = (a); i >= (b); -- i)
using namespace std;
const int maxn = 36;
template <class T>
inline void rd(T &ret) {char c;ret = 0;while ((c = getchar()) < '0' || c > '9');while (c >= '0' && c <= '9') {ret = ret * 10 + (c - '0'), c = getchar();}
}
int dp[maxn][maxn], t[maxn][maxn], n, p[maxn], tot;
int dfs(int l, int r) {if (dp[l][r] > 0)return dp[l][r];if (l > r)return 1;if (l == r) {dp[l][r] = p[l];t[l][r] = l;}else {REP(i, l, r) {int tmp = dfs(l, i - 1)*dfs(i + 1, r) + p[i];if (tmp > dp[l][r]) {dp[l][r] = tmp;t[l][r] = i;}}}return dp[l][r];
}
void dfs2(int l, int r) {if (l > r)return;if (!tot)cout << t[l][r];else cout << ' ' << t[l][r];tot++;dfs2(l, t[l][r] - 1);dfs2(t[l][r] + 1, r);
}
int main()
{rd(n);REP(i, 1, n)rd(p[i]);cout << dfs(1, n) << endl;dfs2(1, n);return 0;
}

转载于:https://www.cnblogs.com/czy-power/p/10459997.html

【树型DP】加分二叉树相关推荐

  1. 其他OJ 树型DP 选课

    在朱全民的PPT介绍的一个树型DP经典题,<选课>,中文题目,不结束 找了很久找到了可以提交的OJ,重庆八中 http://www.cqoi.net:2012/JudgeOnline/pr ...

  2. 【树型DP】BZOJ1564 二叉查找树(noi2009)

    标签: 二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值 ...

  3. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

  4. POJ3342 Party at Hali-Bula(树型DP求最大独立集+唯一解判断)

    题意: 公司参加聚会,要求员工不能和他的上司同时参加,求最多能参加几个人并且判断解是否唯一. 要点: 树型DP的经典题,用dp[u][1]表示选取u的最大值,dp[u][0]表示不选取u的最大值,容易 ...

  5. 虚树+树型DP SDOI2011消耗战

    <虚树+树型DP> SDOI2011消耗战 #include <iostream> #include <cstdio> #include <cstring&g ...

  6. BSOJ 2923:藤原妹红 MST+树型DP

    2923 -- [模拟试题]藤原妹红 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民.由于妹红算得上是幻想乡最强的人类,对于她 ...

  7. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  8. hihocoder 1479 三等分 树型dp

    描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于是小Hi希 ...

  9. 蓝桥杯:生命之树【树型dp】

    之前本菜还没学树型dp的时候,下意识地认为这个东西很难,感觉这个东西结合了搜索+dp这两座算法界的大山必定很难,但万万没想到啊,这个东西很像我之前讲的记忆化搜索,甚至我认为,记忆化搜索的一个作用就是将 ...

最新文章

  1. LeetCode简单题之实现 strStr()
  2. opennre 中文关系抽取_OpenNRE 2.0:可一键运行的开源关系抽取工具包
  3. bLue的二叉树_JAVA
  4. 阿里云发布云原生加速器,携手生态企业拥抱数字时代
  5. unrecognized selector sent to instanceAuto property synthesis will not synthesize property
  6. Java实验实现一个circle类,java实验报告-类的定义.doc
  7. SAP Data Intelligence Modeler里的Kafka Producer和Kafka Consumer
  8. 从listView1中选择记录到listView2中
  9. android 功耗(1)---android 功耗分析方法和优化
  10. 算法:插入排序、归并排序、快速排序、堆排序
  11. NeatUpload
  12. 带经纬度的水印相机_经纬度水印相机怎么设置?
  13. TMC5160步进电机驱动芯片,简析
  14. linux必备软件合集
  15. it论坛 计算机科学概论,(毕业论文) 计算机科学与技术专业 IT技术论坛.doc
  16. html 图片垂直边距,HTML,CSS和垂直文本边距
  17. 【光线追踪系列十七】直接光源采样
  18. PCB原理图绘制(2)——工程文件的初步修改与设置
  19. MySQL 判断是否周末
  20. 方向导数、梯度、等高线、数量场与向量场

热门文章

  1. css小经验: 转载 - CSS文本溢出省略号:text-overflow:ellipsis
  2. 什么时候使用webservice1
  3. 自动生成Insert数据的SQL脚本
  4. Windows驱动开发-_驱动对象学习和内核处理字符串初步
  5. C# mschart 控件的基本使用和图表控件Series的概念
  6. Win32汇编数组编程图解
  7. 自己写编译器学习总结
  8. MAC下 Apache服务器配置
  9. xamarin学习之路 一、vs2015 环境搭建
  10. Android-ImageLoader的最基础的操作