LIS问题分析
题目来源,待字闺中,原创@陈利人
,欢迎大家继续关注微信公众账号“待字闺中”
原题这个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问题分析的更多相关文章
- Poj 1631 Bridging signals(二分+DP 解 LIS)
题意:题目很难懂,题意很简单,求最长递增子序列LIS. 分析:本题的最大数据40000,多个case.用基础的O(N^2)动态规划求解是超时,采用O(n*log2n)的二分查找加速的改进型DP后AC了 ...
- Poj 2533 Longest Ordered Subsequence(LIS)
一.Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...
- Poj 1887 Testing the CATCHER(LIS)
一.Description A military contractor for the Department of Defense has just completed a series of pre ...
- Poj 3903 Stock Exchange(LIS)
一.Description The world financial crisis is quite a subject. Some people are more relaxed while othe ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- lis分析之一一批处理(任务)如何连接数据库的
public class ZFBCheckAccountTask extends TaskThread { } 这个类运行时候自动加载了数据库连接,不明白是如何提前加载的,开始用static { } ...
- frakti && RunPodSandbox 源码分析
listen = flag.String("listen", "/var/run/frakti.sock", "...") hyperEnd ...
- LIS(n^2) POJ 2533 Longest Ordered Subsequence
题目传送门 题意:LIS(Longest Increasing Subsequence)裸题 分析:状态转移方程:dp[i] = max (dp[j]) + 1 (a[j] < a[i],1 ...
- 04_最长上升子序列问题(LIS)
来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题6: 问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除 ...
随机推荐
- Best Component for Bitmap Image
The best is to purchase ImageEn and use the latest version. Coz nothing compares to ImageEn.... But ...
- Rsync、Unison及DRBD的比较
一.Rsync Rsync(remote synchronize),顾名思义,可以知道这是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的 “Rsync算法”来 ...
- Impossible WPF Part 2: Binding Expressions
原文 http://www.11011.net/wpf-binding-expressions Back in April I posted an idea for building an expre ...
- Net::OpenSSH 模块使用
use Net::OpenSSH; my $host = "$ip"; my $user = 'root'; my $passphrase = 'uxxxxxD'; my $key ...
- CSS基础3——使用CSS格式化元素内容的字体
1.CSS属性单位: (1)长度单位:包含绝对长度单位和相对长度单位 绝对长度单位包含:cm.mm.in.pt.pc等. 绝对长度单位最好用于打印输出设备.在仅作为频幕显示时.绝对长度值并没有什么意义 ...
- 【转】windows 7系统安装与配置Tomcat服务器环境
原文链接: windows 7系统安装与配置Tomcat服务器环境 工具/原料 jdk-8u51-windows-x64(我的系统是64位系统,32位的请选x86下载)下载地址:http://www. ...
- list和用vector区别(Vector相当于是数组,读写快,插入慢)
stl提供了三个最基本的容器:vector,list,deque. vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由 ...
- Outlook Express 收发邮件出现"0x800CCC0F"错误代码解决方法
非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...
- android开发之蓝牙配对连接的方法
最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结. 在做android蓝牙串口连接的时候一般会使用 ? 1 2 3 4 5 ...
- Java 自定义日志写入
/** * 将信息写入到日志 * @param content * @return * @throws IOException */ public static boolean writeLog(St ...