要求
- 给定一个整数序列,求其中的最长上升子序列长度
- 子序列元素可不相邻
- 元素相等不算上升
- 一个序列可能有多个最长上升子序列,但最长的长度只有一个
思路
- 暴力解法:选择所有子序列进行判断((2^n)*n)
- 动态规划(n^2)
- LIS(i):[0...i]范围内,选择数字nums[i]可以获得的最长上升子序列长度
- LIS(i) = max( 1 + LIS(j) if nums[i] > nums[j] ) (j<i)
实现

1 class Solution { 2 public: 3 int lengthOfLIS(vector<int>& nums) { 4 5 if( nums.size() == 0 ) 6 return 0; 7 8 // memo[i] 表示以 nums[i] 为结尾的最长上升子序列的长度 9 vector<int> memo(nums.size(),1); 10 for( int i = 1 ; i < nums.size() ; i ++ ) 11 for( int j = 0 ; j < i ; j ++ ) 12 if( nums[j] < nums[i] ) 13 memo[i] = max( memo[i] , 1 + memo[j] ); 14 15 int res = 1; 16 for( int i = 0 ; i < nums.size() ; i ++ ) 17 res = max( res, memo[i] ); 18 19 return res; 20 } 21 };
相关
- 376 Wiggle Subsequence