-
题目描述:
-
给定一个整数序列,请问如何去掉最少的元素使得原序列变成一个全递增的序列。
-
输入:
-
输入的第一行包括一个整数N(1<=N<=10000)。
接下来的一行是N个满足题目描述条件的整数。
-
输出:
-
可能有多组测试数据,对于每组数据,
输出去掉最少的元素后的全递增序列。
-
样例输入:
-
8 186 186 150 200 160 130 197 220
-
样例输出:
-
150 160 197 220
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int a[10000],n,LIS[10000],maxlis,pre[10000];
while(cin >> n){
for(int i = 0;i < n;i++)
scanf("%d",&a[i]);
maxlis = 1;
int maxindex = 0;
for(int i = 0;i < n;i++){
LIS[i] = 1;
for(int j = 0;j < i;j++)
if(a[j] < a[i] && LIS[j] + 1 > LIS[i]){
LIS[i] = LIS[j] + 1;
pre[i] = j;
if(LIS[i] > maxlis){
maxlis = LIS[i];
maxindex = i;
}
}
}
int b[10000],count = 0;
while(maxlis){
b[count++] = a[maxindex];
maxindex = pre[maxindex];
maxlis--;
}
for(int i = count - 1;i > 0;i--)
cout << b[i] << " ";
cout << b[0] << endl;
}
return 1;
}
-
O(nlgn)的算法
int len = 0;
for(int i = 1;i <= n;i++){
int top = len;
int base = 1;
while(base <= top){
int mid = (top + base) / 2;
if(buf[mid] >= a[i])
top = mid - 1;
else
base = mid + 1;
}
buf[base] = a[i];
if(base > len)
len = base;
l1[i] = len;
}