编程之美 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.在这个过程中,需要用一个变长数组来维护前面计算的结果。
从后向前迭代:-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; }
相关文章推荐
- 编程之美 2.16 求数组中最长递增子序列
- 读书笔记之编程之美 - 2.16 求数组中最长递增子序列
- 编程之美-2.16-求数组中最长递增子序列
- 编程之美---求数组中最长递增子序列LIS
- 《编程之美》读书笔记17: 2.16 求数组中最长递增子序列
- 编程之美--求数组中最长递增子序列
- 2.16 求数组中最长递增子序列
- 2.16 求数组中最长递增子序列
- 《编程之美》读书笔记17: 2.16 求数组中最长递增子序列
- 编程之美---求数组中最长递增子序列
- 编程之美读书笔记_2.16 求数组中最长递增子序列
- [编程之美] PSet2.16 求数组中最长的递增子序列
- [编程之美]求数组中最长递增子序列
- 编程之美2.16——求数组中最长递增子序列
- 【编程之美】2.16 求数组的最大递增子序列
- 编程之美2.16求数组中最长递增子序列Java版
- 编程之美2.16求数组中最长递增子序列
- 编程之美2.16 求数组中最长递增子序列
- 求数组中最长递增子序列(编程之美2.16)
- 编程之美读书笔记之2.16求数组中最长递增子序列