LIS 最长单调子序列模板

namespace LIS

{

template <class  T>

int lis(vector<T> v)

{

    if(v.empty())return 0;

    vector<T> d;

    for(int i=0;i<v.size();i++)

    {

        int l=0,r=d.size(),m=0;

        while(l<r)

        {

            m=(l+r)/2;

            if(!(v[i]<d[m])) l=m+1;

            else r=m;

        }

        if(l==d.size())

            d.push_back(v[i]);

        else d[l]=v[i];

    }

    for(int i=0;i<d.size();i++)

        cout<<d[i]<<' ';

    return d.size();

}

template <class T,class C>

    int lis(vector<T> v,C cmp)

    {

        if(v.empty())return 0;

        vector<T> d;

        for(int i=0;i<v.size();i++)

        {

            int l=0,r=d.size(),m=0;

            while(l<r)

            {

                m=(l+r)/2;

                if(!cmp(v[i],d[m])) l=m+1;

                else r=m;

            }

            if(l==d.size())

                d.push_back(v[i]);

            else d[l]=v[i];

        }

        return d.size();

    }

}

 

 

posted @ 2013-06-27 01:07  goagain  阅读(271)  评论(0编辑  收藏  举报