最长上升子序列
给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度.
样例 1:
输入:
[5,4,1,2,3]
输出:
3
解释:
LIS 是 [1,2,3]
样例 2:
输入:
[4,2,4,5,3,7]
输出:
4
解释:
LIS 是 [2,4,5,7]
最长上升子序列的定义:
最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的
子序列,这种子序列不一定是连续的或者唯一的。
解答:
定义DP[i] 为整数序列中第i个值为上升子序列值最大值时的 最大上升子序列长度。
如:[4,2,4,5,3,7]
DP[1] = 1;
DP[2] = 1;
DP[3] = 2;
DP[4] = 3;
DP[5] = 2;
DP[6] = 4;
则最后最大上升子序列则为DP数组中最大的值。
则有状态转换方程:
DP[i] = max(DP[i], DP[k] + 1) { 1 <= k < i, array[i-1] > array[j-1] }
DP数组所有值初始值为1.
class Solution {
public:
/**
* @param nums: An integer array
* @return: The length of LIS (longest increasing subsequence)
*/
int longestIncreasingSubsequence(vector<int> &nums) {
// write your code here
if(nums.empty()){
return 0;
}
int m = nums.size() + 1;
int *dp = new int[m];
for (int i = 0; i < m; i++) {
dp[i] = 1;
}
for (int i = 2; i < m; i++) {
for (int j = 1; j < i; j++) {
if(nums[i-1] > nums[j-1]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int mRet = 0;
for (int i = 0; i < m; i++) {
mRet = max(mRet, dp[i]);
}
delete[] dp;
return mRet;
}
};