Lisアルゴリズム

1493 ワード

最も長男のシーケンスをより効率的に求めるアルゴリズムです.
はっきり言って、このアルゴリズムは配列を維持することで、最初はこの配列は何もありませんでした.
例を挙げると、我々が与えた配列はa[]={1 7 3 5 9 4 8}であり、その後、a[i]>b配列の最後の数であればlen+,b[len]=a[i]のルールに従うb配列(メンテナンス配列)を定義する.そうでなければ、既存の長さのb配列の中でa[i]より大きい最初の数を見つけて、a[i]で置き換えます.最後のb配列の長さは最長上昇サブシーケンスである.
具体的な手順は次のとおりです.
初めて私たちは1をb配列にあげましたb={1}
そして7対1の大きいb={1,7}
7は最初の3より大きい数で、3で7をb={1,3}に置き換えます.
5は3より大きいb={1 3 5}
9は5より大きいb={1 3 5 9}
5は最初の4より大きい数で、5 b={1 3 4 9}を4で置き換えます.
9は8より大きい最初の数で9 b={1 3 4 8}を8で置き換える
最長上昇シーケンスの長さは4です
code:
#if 1 //  
#include
using namespace std;
int binary(int val,int a[],int l,int r)
{
	int m;
	int id;
	while(l<=r)
	{
		m=l+(r-l)/2;
		if(a[m]>val)
		{
			id=m;
			r=m-1;	
		}
		else
			l=m+1;
		
	}
	return id;
}

int main()
{
	int a[1000],l,r,len=0;
	int b[1000];           //     
	int n;
	cin>>n; 
	for(int i=0; i>a[i];
	} 
	
	b[0]=a[0];
	len=1;
	for(int i=1; ib[len-1])
		{
			len++;
			b[len-1]=a[i];
		}
		else if(a[i]
using namespace std;

int main()
{
	int a[1000],l,r,len=0;
	int b[1000];           //     
	int n;
	cin>>n; 
	for(int i=0; i>a[i];
	} 
	
	b[0]=a[0];
	len=1;
	for(int i=1; ib[len-1])
		{
			len++;
			b[len-1]=a[i];
		}
		else
		{
			*lower_bound(b,b+len,a[i])=a[i]; 
		  
		}	
		for(int i=0; i