用C++求最长递增子序列

本文介绍如何使用C++求解无序整数序列的最长递增子序列。通过构造一个类似堆的数据结构,利用节点的值和深度,回溯得到最长递增子序列。文章详细阐述了实现过程,包括GetMinValue类获取序列最小值,Node类表示树节点,以及Tree类构建树并输出结果。
摘要由CSDN通过智能技术生成

给定一个无序整数序列,怎样求其最长递增子序列?
#include <deque>
#include <cassert>
void MaxIncreaseQueue(const std::deque<int> & source,std::deque<int> & result)
{
    typedef std::deque<int> IntArray;
    //怎样从source中得到最长递增子序列放到result中?
}
经过分析我们发现,首先,我们要得到这个序列的最小值,所以我们建立了我们的第一个类GetMinValue:
class GetMinValue
{
    int minvalue_;
public:
    explicit GetMinValue(const IntArray & in){
        assert(in.size() != 0);
        IntArray::const_iterator i = in.begin();
        for(minvalue_ = *i,++i;i != in.end();++i){
            if(minvalue_ > *i)
                minvalue_ = *i;
        }
    }
    ~GetMinValue(){}
    operator int() const{
        return minvalue_;
    }
};
可以看到,GetMinValue以一个IntArray 为参数构造,并由operator int() const来返回其最小值。这样,我们可以这样来得到source的最小值:
int min = GetMinValue(source);
然后我们开始考虑算法的问题。我想很多人都知道计算机里的堆的概念,一个堆就是一个类似于树的结构,只是它的节点满足一定的排列规则,于是比一般的树更有规律,也更复

杂。我们这里构造这样一个堆(同时也是一棵树,所以我用了Tree这个名字),其父节点的值总比子节点小(或相等),其右节点的值总比左节点小,如图:
                   2   ——父节点值比子节点小
                  / /           

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值