- 题目描述:
-
给定一个整数序列,请问如何去掉最少的元素使得原序列变成一个全递增的序列。
- 输入:
-
输入的第一行包括一个整数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;
}
本文介绍了一种求解最长递增子序列(LIS)问题的算法,通过实例详细展示了如何利用动态规划思想找到给定序列中最长递增子序列的方法,并提供了两种不同实现方式的代码示例。

被折叠的 条评论
为什么被折叠?



