最長上升子序列

思路:用動態規劃+二分搜索進行

#include<iostream>
using namespace std;

//二分搜索,返回>=target的第一個數的下標
int binarySearch(int *A,int N,int target)
{
	int lo=0,hi=N-1;
	while(lo<=hi)
	{
		int mid=lo+((hi-lo)>>1);
		if(A[mid]<target)
			lo=mid+1;
		else
			hi=mid-1;
	}
	return lo;
}

//求數組最長上升子序列,複雜度O(NlogN)
//注意,結束時的dp數組中存放的不是最終上升子序列
int longestIncreaceSubsequence(int *A,int N)
{
	if(N<0)
		return 0;
	int *dp=new int[N];//可以用vector來做
	dp[0]=A[0];
	int k=1;
	for(int i=1;i<N;i++)
	{
		if(dp[k]<A[i])
			dp[++k]=A[i];
		else
			dp[binarySearch(dp,k,A[i])]=A[i];//找dp中比A[i]大的第一個數進行替換
	}
	delete []dp;
	return k;
}

int main()
{	
	int A[]={1,5,8,3,6,7};
	cout<<longestIncreaceSubsequence(A,6)<<endl;

	system("pause");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章