题目1262:Sequence Construction puzzles(I)_构造全递增序列

来源:互联网 发布:手机打印机软件 编辑:程序博客网 时间:2024/06/06 02:40
题目描述:

给定一个整数序列,请问如何去掉最少的元素使得原序列变成一个全递增的序列。

输入:

输入的第一行包括一个整数N(1<=N<=10000)。
接下来的一行是N个满足题目描述条件的整数。

输出:

可能有多组测试数据,对于每组数据,
输出去掉最少的元素后的全递增序列。

样例输入:
8186 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;elsebase = mid + 1;}buf[base] = a[i];if(base > len)len = base;l1[i] = len;}


原创粉丝点击