博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树形动态规划
阅读量:4880 次
发布时间:2019-06-11

本文共 857 字,大约阅读时间需要 2 分钟。

 •给定一个中序遍历为1,2,3,,n的二叉树

每个结点有一个权值
定义二叉树的加分规则为:
左子树的加分×
右子树的加分+根的分数
若某个树缺少左子树或右子树,规定缺少的子树加
分为
1
构造符合条件的二叉树
该树加分最大
输出其前序遍历序列
 
定义dp[i][j] 为中序遍历为i-->j的二叉树的最大加分
那么dp[i][j] = max{dp[i][k-1] * dp[k+1][j] + a[k];   i<=k<=j}
 其实就相当于区间dp,只不过是在树上而已
输入样例:
5 7 1 2 10
1 #include 
2 #include
3 4 int a[30]; 5 int dp[30][30];//dp[i][j] 表示某子树的中序遍历为i-->j 那么dp[i][i]则表示i为叶子结点 6 int root[30][30]; 7 8 void print(int i, int j) 9 {10 if(i>j)return;11 if(root[i][j]==-1) return;12 printf("%d ",root[i][j]+1);13 print(i,root[i][j]-1);14 print(root[i][j]+1,j);15 }16 int main()17 {18 int n,i,j,k,t;19 while(scanf("%d",&n)!=EOF)20 {21 memset(dp,-1,sizeof(dp));22 memset(root,-1,sizeof(root));23 for(i=0; i

 

转载于:https://www.cnblogs.com/justPassBy/p/4293286.html

你可能感兴趣的文章
赛斯说
查看>>
python 中的pipe
查看>>
(SQL Analyzer services)定义链接维度
查看>>
squid
查看>>
系统开发管理、架构与设计步步谈随笔索引
查看>>
Java的时间空间复杂度详解
查看>>
有效防止SQL注入漏洞
查看>>
Linux chown命令
查看>>
十、I/O流——4-输入、输出流体系
查看>>
十二、网络编程——4-基于UDP协议的网络编程
查看>>
异常处理与调试6 - 零基础入门学习Delphi55(完)
查看>>
if语句三种形式
查看>>
正则表达式之字符串验证
查看>>
codeblocks如何支持_tmain?可移植代码的编码推荐
查看>>
省市联动 填坑
查看>>
canvas写的一个小时钟demo
查看>>
原来今天是冬至
查看>>
又混了一天班
查看>>
九度oj 1006
查看>>
HDU6400-2018ACM暑假多校联合训练1004-Parentheses Matrix-构造
查看>>