您的位置:首页 > 编程语言

编程之美 2.16 求数组中最长递增子序列

2012-12-27 15:49 281 查看
解题思路:设数组为1,-1,2,-3,4,-5,6,-7

从后向前迭代:-7首先直接放入临时数组(-7,1),1代表长度为1;

6,比-7大,所以不能和-7组合为递增序列,同时6肯定优于-7,所以置换为(6,1);

-5比6小,可以和6组合为递增序列,(-5,2),(6,1);

       4比6小,可以和6组合为递增序列,同时,4比-5大,所以置换为(4,2),(6,1);

       -3比6小,可以组合,同时,-3比4小,也可组合,添加,(-3,3),(4,2),(6,1);

       2比6小,可以组合,2比4小,也可组合,2比-3大,置换(2,3),(4,2),(6,1);

       -1比它们都小,可以添加,(-1,4),(2,3),(4,2),(6,1);

       1比6,4,2小,比-1大,置换,(1,4),(2,3),(4,2),(6,1);

      结束。

最终得出最长的长度即为4.在这个过程中,需要用一个变长数组来维护前面计算的结果。

#include<iostream>
#include<vector>
using namespace std;

int LIS(int *arr, int N){
vector<int> vec;
vec.push_back(arr[N-1]);
for (int i = N - 2; i >= 0; --i){
int len = vec.size();
for (int j = 0; j < len; ++j){
if (arr[i] > vec[j]){
vec[j] = arr[i];
}
else{
if (j + 1 > len - 1)
vec.push_back(arr[i]);
else
if (arr[i] > vec[j+1]){
vec[++j] = arr[i];
}
}
}
}
return vec.size();
}

int main(){
int N;
cin >> N;
int arr[100];
for (int i = 0; i < N; ++i)
cin >> arr[i];
cout << LIS(arr, N) << endl;
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: