思路:用動態規劃+二分搜索進行
#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;
}