最长上升子序列 LIS
给定一个无序的整数数组,找到其中最长上升子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的一个子序列。
最长上升子序列 LIS
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 int lengthOfLIS(vector<int>& nums) { 7 if (nums.empty()) return 0; 8 int n = nums.size(); 9 vector<int> dp(n, 1); 10 int ans = 1; 11 for (int i = 1; i < n; ++i) { 12 for (int j = 0; j < i; ++j) { 13 if (nums[j] < nums[i]) { 14 /* 15 如果条件满足,说明又找到一个可以增加长度的数字nums[j],那么原有dp[j]会再增加一个长度, 16 但nums[i]和比num[j]前面的数字num[0]~num[j-1]进行比较时,如果也有条件满足的数字, 17 dp[i]也会加长度的,所以dp[i]里面也是有长度记载的,此时需要比较当次再增加一个长度 18 的 dp[j] + 1 和 dp[i] 哪个大才是目前最大的长度 19 */ 20 dp[i] = max(dp[i], dp[j] + 1); 21 } 22 } 23 ans = max(ans, dp[i]); 24 } 25 return ans; 26 } 27 28 int main() { 29 vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18}; 30 cout << "最长上升子序列的长度为: " << lengthOfLIS(nums) << endl; 31 return 0; 32 }
思路
定义 dp[i] 表示以第 i 个元素结尾的最长上升子序列的长度。
状态转移方程为:dp[i] = max(dp[j]) + 1,其中 0 <= j < i 且 nums[j] < nums[i]。
定义 dp[i] 表示以第 i 个元素结尾的最长上升子序列的长度。
状态转移方程为:dp[i] = max(dp[j]) + 1,其中 0 <= j < i 且 nums[j] < nums[i]。

浙公网安备 33010602011771号