最長下降しないシーケンスnlognアルゴリズム


O(nlogn)のアルゴリズムの鍵は配列temp[]を確立することであり、temp[i]は長さiの下降しないシーケンスの末尾要素の最小値を表し、topは配列の現在の長さを表し、アルゴリズムが完了した後のtopの値は最長の下降しないサブシーケンスの長さである.
現在求められている長さをtopとするとnum[i]とtemp[top]:
1.num[i]>=temp[top]、すなわちnum[i]がtop長のシーケンスの最後の要素より大きい場合、シーケンスの長さを1、すなわちtop++増加させ、現在のtemp[top]=num[i]にすることができる.
2.num[i]の場合
#include 
#define SIZE 1001
 
using namespace std;
 
int main()
{
    int i, j, n, top, temp;
    int stack[SIZE];
    cin >> n;
 
    top = 0;
    /*         0 */
    stack[0] = -1;
    for (i = 0; i < n; i++)
    {
        cin >> temp;
        /*            */
        if (temp > stack[top])
        {
            stack[++top] = temp;
        }
        else
        {
            int low = 1, high = top;
            int mid;
            /*       >=temp         */
            while(low <= high)
            {
                mid = (low + high) / 2;
                if (temp > stack[mid])
                {
                    low = mid + 1;
                }
                else
                {
                    high = mid - 1;
                }
            }
            /*  temp   */
            stack[low] = temp;       //             temp     
        }
    }
 
    /*             */
    cout << top << endl;
 
    //system("pause");
    return 0;
}

 
 
 

 lower_bound    :
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int main()
{
    int stack[1005];
    int n,top=0,temp;
    cin>>n;
    stack[0]=-1;
    for(int i=0;i>temp;
        if(temp>=stack[top])
        stack[++top]=temp;
        else
        {
            int loc=lower_bound(stack,stack+top,temp)-stack;  //     >=temp     ,