最長上昇サブシーケンスLIS O(nlgn)アルゴリズム

734 ワード

問題は説明しないで、このアルゴリズムを見ている人はみな知っていると信じています.
int LIS(int str[],int len)
{
    int max,left,right,i,mid;
    lis[1] = str[0];
    max = 1;
    for(i=1; i<len; i++)
    {
        if(str[i] > lis[max])
        {
            lis[++max] = str[i];
        }
        else
        {
            left = 1;
            right = max;
            while(left <= right)
            {
                mid = (left+right)/2;
                if(str[i] > lis[mid])
                    left = mid + 1;
                else if(str[i] < lis[mid])
                    right = mid - 1;
                else
                    break;
            }
            lis[left] = str[i];
        }
    }
    return max;
}