题目概述
解题思路
最长上升子序列,采用O(n log n)求解的方法即可。
方法性能
代码示例
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int N;
while(scanf("%d", &N) != EOF)
{
int *A = new int[N];
for (int i = 0; i < N; ++i)
scanf("%d", A + i);
//store the most probabilistic longest arrays
int *probs = new int[N];
int probs_len = 0;
//to use binary search to locate the larger elem to be replaced
for (int i = 0; i < N;++i)
{
if(probs_len == 0 || probs[probs_len - 1] < A[i])
probs[probs_len++] = A[i];
else
{
int* lower_pos = lower_bound(probs, probs + probs_len, A[i]);
*lower_pos = A[i];
}
}
printf("%d\n", probs_len);
}
return 0;
}
PS:
1. 用cin/cout显示超时(如上图所示),改为scanf/printf就好了。。。
2. poj的G++编译器在使用scanf/printf时,需要#include<stdio.h>。