P1040 加分二叉树(树形dp)
来源:互联网 发布:aws ubuntu安装锐速 编辑:程序博客网 时间:2024/05/22 09:40
题目链接https://www.luogu.org/space/show?uid=45444
题目描述
设一个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
#include<iostream>#include<cstring>#include <cstdio>using namespace std;int n;long best[40][40];int root[40][40];bool first;void dfs2(int l,int r){ if(l>r) return ; if(first) first=0; cout<<root[l][r]<<" "; dfs2(l,root[l][r]-1); dfs2(root[l][r]+1,r);}long long dfs(int l,int r){ int now;//当前值 if(l>r) return 1; else{ if(best[l][r]==-1)//这段区间没有被更新过 { for(int i=l;i<=r;i++)//枚举根 { now=dfs(l,i-1)*dfs(i+1,r)+best[i][i]; if(now>best[l][r]) { best[l][r]=now; root[l][r]=i; } } } return best[l][r]; }}int main(){ int n; memset(best,-1,sizeof(best));//最优质 memset(root,-1,sizeof(root)); scanf("%d",&n); for(int i=1;i<=n;i++){ cin>>best[i][i]; root[i][i]=i; } cout<<dfs(1,n)<<endl; first=true; dfs2(1,n);}
树形dp,类似于区间dp
阅读全文
0 0
- P1040 加分二叉树(树形dp)
- 洛谷P1040 加分二叉树(DP)
- 区间dp-洛谷P1040 加分二叉树
- P1040 加分二叉树(区间DP)
- 洛谷P1040 加分二叉树(NOIP2003)
- 洛谷 P1040 加分二叉树
- 洛谷 P1040 加分二叉树
- 洛谷 P1040 加分二叉树
- 洛谷 P1040 加分二叉树
- 洛谷 [P1040]加分二叉树
- 加分二叉树(树形dp)
- 加分二叉树(树形dp)
- 加分二叉树 树形DP
- Vijos P1100 加分二叉树(区间DP,树形DP)
- 洛谷 P1040 [NOIP2003 T3] 加分二叉树
- P1040 加分二叉树 记忆化搜索
- [CODEVS1090][NOIP2013]加分二叉树(树形dp)
- code vs 1090 加分二叉树 (树形DP)
- Centos 6.9安装docker
- PCA原理及特征脸
- shiro session 监听
- libzlib LNK2019错误之解决方法
- redis | set命令
- P1040 加分二叉树(树形dp)
- I.MX6Q-ipu视频流格式转换
- 使用两种不同配置的K近邻(回归)模型对美国波士顿房价数据进行回归预测
- 服务端 I/O 性能大比拼:Node、PHP、Java 和 Go
- Webservice与Socket接口调用的区别和比较
- SpringBoot过滤器的使用
- 用Eclipse tomcat新建一个JSP页面(一)
- 同一节点多数据源的事物管理(配置多个事物实现)
- AFNetworking源码分析(一)