C++ 最长上升子序列(一)
//给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。 //所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如[1, 5, 3, 7, 3] 数组,其子序列有:[1, 3, 3]、[7] 等。但[1, 6]、[1, 3, 5] 则不是它的子序列。 //我们定义一个序列是严格上升的,当且仅当该序列不存在两个下标i和j满足 i < j且 arr[i] >= arr[j] //数据范围:0≤n≤1000 //要求:时间复杂度 O(n^2), 空间复杂度 O(n) int LIS(vector<int>& arr) { int result = 0; int length = arr.size(); vector<int> amount(length);//amount[i]存放0-i的最长上升子序列的长度 for (int i = 0; i < length; ++i) { int m = 0; for (int j = i - 1; j >= 0; --j) { //向前寻找最后元素比arr[i]小的最长上升子序列的长度 if (arr[j] < arr[i] && amount[j] > m) { m = amount[j]; } } int num = m + 1; amount[i] = num; if (num > result) result = num; } return result; }