题目来源,待字闺中,原创@陈利人
,欢迎大家继续关注微信公众账号“待字闺中”

原题这个LIS问题,可不是Longest Increasing Subsequence,而是Largest Independent Set,含义例如以下:给定一棵二叉树,找到满足例如以下条件的最大节点集合:集合中的随意两个节点之间,都没有边。例如以下图:

LIS大小为5,为{10,40,60,70,80}.

分析:首先还是递归思想,比方对于根节点10,假设把10放入LIS则,20和30不能放入,但它们的孩子40、50、60能够;假设不把10放入,则它的孩子20和30能够,如此可得递归方程式为

fun(root)=max(fun(root->left)+fun(root->right),1+fun(root->left->left)+fun(root->left->right)+fun(root->right->left)+fun(root->right->right));相同,由于存在反复子问题,因此能够考虑动态规划,可是对于树来说,动态规划须要特殊处理,由于我们没办法从下往上进行处理,这里有一个技巧,我们能够给树节点加入一个标志lis,当该节点没有訪问时lis初始化为0,訪问后lis保存为当前节点的lis集合的大小,从而能够避免反复递归,详细见代码:

struct BinaryTreeNode
{
int data;
int lis;//表示以当前节点为根时lis集合的大小,初始化为0,能够防止反复递归
BinaryTreeNode* left;
BinaryTreeNode* right;
BinaryTreeNode(int val):data(val),lis(0),left(NULL),right(NULL){}
}; int LIS(BinaryTreeNode* root)
{
if(root == NULL)return 0;
if(root->lis)return root->lis;
int numNotContainRoot = LIS(root->left)+LIS(root->right);//根节点不增加lis
int numContatinRoot = 1;//根节点增加lis
if(root->left) numContatinRoot+=LIS(root->left->left)+LIS(root->left->right);
if(root->right)numContatinRoot+=LIS(root->right->left)+LIS(root->right->right);
root ->lis = max(numNotContainRoot,numContatinRoot);//保存当前根节点所在子树的lis大小
return root->lis;
}

本代码仅仅代表个人观点,如有错误,请指正,谢谢

LIS问题分析的更多相关文章

  1. Poj 1631 Bridging signals(二分+DP 解 LIS)

    题意:题目很难懂,题意很简单,求最长递增子序列LIS. 分析:本题的最大数据40000,多个case.用基础的O(N^2)动态规划求解是超时,采用O(n*log2n)的二分查找加速的改进型DP后AC了 ...

  2. Poj 2533 Longest Ordered Subsequence(LIS)

    一.Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...

  3. Poj 1887 Testing the CATCHER(LIS)

    一.Description A military contractor for the Department of Defense has just completed a series of pre ...

  4. Poj 3903 Stock Exchange(LIS)

    一.Description The world financial crisis is quite a subject. Some people are more relaxed while othe ...

  5. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  6. lis分析之一一批处理(任务)如何连接数据库的

    public class ZFBCheckAccountTask extends TaskThread { } 这个类运行时候自动加载了数据库连接,不明白是如何提前加载的,开始用static { } ...

  7. frakti && RunPodSandbox 源码分析

    listen = flag.String("listen", "/var/run/frakti.sock", "...") hyperEnd ...

  8. LIS(n^2) POJ 2533 Longest Ordered Subsequence

    题目传送门 题意:LIS(Longest Increasing Subsequence)裸题 分析:状态转移方程:dp[i] = max (dp[j]) + 1   (a[j] < a[i],1 ...

  9. 04_最长上升子序列问题(LIS)

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题6: 问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除 ...

随机推荐

  1. Ubuntu服务器上SSH Server 的安装和设置

    网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务.最终成功的方法如下: ...

  2. 【引用】Linux 内核驱动--多点触摸接口

    本文转载自James<Linux 内核驱动--多点触摸接口>   译自:linux-2.6.31.14\Documentation\input\multi-touch-protocol.t ...

  3. CCIE路由实验(2) -- BGP选路原则

    BGP路径属性分为4类: 公认必遵(Well-Known Mandatory):BGP更新报文中必须包含的,且必须被所有BGP厂商实现所能识别的,包括ORIGIN,AS-PATH和Next_Hop 1 ...

  4. hdu 4736 This Is The Job The Bear Finds(2013年成都ACM网络赛)

    // Time 1718 ms; Memory 1500 K #include<iostream> #include<cstdio> #include<cmath> ...

  5. mongodb副本集自动切换修复节点解决方案

    副本集部署 1.启动mongod 在每台运行mongod服务的机器上增加配置文件/etc/mongodb-rs.conf,内容为: [root@MongodbF-A etc]# vi /etc/mon ...

  6. Linux定义系统提示符的变量:PS1

  7. Linux之shell编程基础

    一.变量 变量在shell中分为:本地变量.环境变量.位置参数: 本地变量:仅可在用户当前shell生命期的脚本中使用的变量,本地变量随着shell进程的消亡而无效,本地变量在新启动的shell中依旧 ...

  8. CAN总线基础

    can总线协议: 涵盖了OSI规定的传输层.数据链路层.物理层 物理层: 决定了位编码方式(NRZ编码,6个位插入填充位),位时序(位时序.位的采样).同步方式(根据同步段ss实现同步,并具有再同步功 ...

  9. MySQL - 主从复制及读写分离原理

    1.MySQL主从复制与读写分离原理 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL ...

  10. AdbWinApi编译详解(本人亲历)

    1. 从微软官方下载WDDK,比如:GRMWDK_EN_7600_1.ISO(http://download.microsoft.com/download/4/A/2/4A25C7D5-EFBE-41 ...