一个是O(n^2)一个是O(logn*n)
两者都需要临时空间
#include <iostream>
using namespace std;
//time complex:n^n
int longest_increase_sequence(int a[], int n)
{
if(n==1)
return n;
int b[n];
int i,j;
int tmp, result=1;
b[0] = 1;
for(i=1;i<n;i++)
{
tmp= 1;
for(j=0;j<i;j++)
{
if(b[j]>=tmp&&a[j]<=a[i])
tmp = b[j] +1;
}
b[i] = tmp;
if(b[i]>result)
result = b[i];
}
return result;
}
//length increased return true
bool binary_replace(int a[], int n, int val)
{
if(n==0)
{
a[0] = val;
return true;
}
int i;
for(i=0;i<n;i++)
{
if(a[i]>val)
{
a[i] = val;
return false;
}
}
if(i==n)
{
a[n] = val;
return true;
}
}
int longest_increase_sequence2(int a[], int n)
{
if(n<=1)
return n;
int b[n];
int result = 1;
int len = 1;
b[0] = a[0];
for(int i=1;i<n;i++)
{
if(binary_replace(b,len,a[i]))
len++;
}
return len;
}
int main()
{
int n;
int a[100];
while(cin>>n)
{
for(int i=0;i<n;i++)cin>>a[i];
cout<<longest_increase_sequence(a,n)<<endl;
cout<<longest_increase_sequence2(a,n)<<endl;
}
return 0;
}