最长递增子序列
51Nod - 11341.第一种方法(两层for循环暴力)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int N;
int a[50005];
int res[50005];
while(cin>>N)
{
for(int i = 0; i < N; i++)
{
cin>>a[i];
}
int maxx = -999999999;
int tail = 0;
for(int i = 0; i < N; i++)
{
if(a[i] > maxx)
{
res[tail++] = a[i];
}
else
{
for(int j = 0; j < tail; j++)
{
if(a[i] <= res[j])
{
res[j] = a[i];
break;
}
}
}
maxx = res[tail-1];
}
cout << tail << endl;
}
return 0;
}
2.第二种方法,加上了二分优化
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int N;
int a[50005];
int res[50005];
while(cin>>N)
{
for(int i = 0; i < N; i++)
{
cin>>a[i];
}
int maxx = -999999999;
int tail = 0;
for(int i = 0; i < N; i++)
{
if(a[i] > maxx)
{
res[tail++] = a[i];
}
else
{
int l = 0;
int r = tail-1;
int m = l + (r-l)/2;
while(l < r)
{
if(res[m] < a[i])
{
l = m + 1;
}
else
{
r = m;
}
m = l + (r-l)/2;
}
res[m] = a[i];
}
maxx = res[tail-1];
}
cout << tail << endl;
}
return 0;
}
3.第三种方法,用STL库中自带的库函数来求解这道题(lower_bound)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int N;
int a[50005];
vector<int> res;
while(cin>>N)
{
for(int i = 0; i < N; i++)
{
cin>>a[i];
}
int maxx = -999999999;
int tail = 0;
for(int i = 0; i < N; i++)
{
if(a[i] > maxx)
{
res.push_back(a[i]);
tail++;
}
else
{
vector<int>::iterator it = lower_bound(res.begin(),res.end(),a[i]);
*it = a[i];
}
maxx = res[tail-1];
}
cout << tail << endl;
}
return 0;
}