转自:(http://www.cnblogs.com/geek-007/p/7197439.html)

经典例题:加分二叉树(Luogu 1040)

  设一个 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 的前序遍历:
- 5 7 1 2 10
- 答案 1: 145
- 答案 2: 3 1 2 4 5
设 F[i][j] 为只用第 i 个数到第 j 个数构成的加分树的最大权值。下图为样例解释:

牢记一个二叉树的性质:中序遍历时候,左右子树一定在根节点左右两边

* 枚举根节点,这样就化成了左子树和右子树的问题,求最优解即可。
* F[i][j] = MAX ( F[i][k-1] * F[k+1][j] + A[k] )(左×右+根k自己本身权值)

//T25:加分二叉树
;i<=n;++i) f[i][i]=a[i];//赋初值(只有一个叶子节点,根就是自己)
;i<=n;++i) f[i+][i]=;
;k<n;++k)
    ;i+k<=n;++i)
    {
        int j=i+k;
        ]*f[l+][j]+a[l]);//枚举根节点
    }
][n];

* 问题: 如何求出树的前序遍历(树的形态)

我们另外记录一个辅助数组 G[i][j],代表 F[i][j] 取最大值的时候,根节点是什么,这样就可以通过递归来求出树的前序遍历。

;i<=n;++i) f[i][i]=a[i],g[i][i]=i;//边界值(只有一个叶子节点,根就是自己)
;i<=n;++i) f[i+][i]=;//预处理空节点,保证不出错,一个根节点没有左子树,把左子树标记为1
;k<n;++k)//k:区间长度
;i+k<=n;++i)
{
    int j=i+k;//j:末尾节点
    for(int l=i;l<=j;++l)
    {
        ]*f[l+][j]+a[l];
        if(t>f[i][j])//记录最优的根
        {
            f[i][j]=t;
            g[i][j]=l;
        }
    }
}
//T25:加分二叉树
//递归输出x到y这个树的前缀遍历
void dfs(int x,int y)
{
    if(x>y) return;
    int l=g[x][y];//l为根
    cout<<l<<" ";//先输出l
    /*=====================*///再输出子树的值
    dfs(x,l-);//左
    dfs(l+,y);//右
    /*=====================*/
}
...
//输出答案——整棵树
dfs(,n);

最新文章

  1. getComputedStyle的应用
  2. 服务器一般达到多少qps比较好[转]
  3. Hibernate框架之Criteria查询
  4. 运行setup.js文件
  5. java web中cookie的永久创建与撤销
  6. PAT-乙级-1030. 完美数列(25)
  7. What is SuppressWarnings (“unchecked”) in Java?
  8. 我的第一个QML Button的实现
  9. 基于visual Studio2013解决算法导论之055拓扑排序
  10. 基于visual Studio2013解决面试题之0309左移递减序列搜索
  11. cocoaPods第三方库使用详解
  12. Jenkins slave image
  13. MySQL学习笔记_3_MySQL创建数据表(中)
  14. Bluedroid 函数分析:BTA_GATTC_Open
  15. 步步为营-72-asp.net简单练习(通过webForm实现一些简单实例)
  16. 电商sku商品推荐
  17. nginx的hash
  18. 10 个免费的Bootstrap Admin 主题,模板收集
  19. C++设计模式 ==&gt; 装饰(者)模式
  20. SQL Server 2012 Always on Availability Groups安装

热门文章

  1. 对Java原子类AtomicInteger实现原理的一点总结
  2. Linux系列教程(八)——Linux常用命令之压缩和解压缩命令
  3. Java基础——数据类型
  4. THINKPHP中几个缓存的问题
  5. HTTP服务简介
  6. 修改Jenkins用户的密码
  7. java三级考试理论题
  8. document.body.scrollTop 值总为0
  9. number 类型转换 符号
  10. jQuery选择器(ID选择器)第一节