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

题目描述:

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

输入:

输入的第一行包括一个整数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;
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值