编程之美 2.16 求数组中最长递增子序列
解题思路:设数组为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; }