1、問題描述
給定一個無序的數組,求數組中最長遞增子序列的最大長度。
一個數組可能由多個遞增子序列,求這些子序列中的最大長度。
輸入:[10,9,2,3,1,7,18]
輸出:4
解釋:最長的遞增子序列爲[2,3,7,18],其長度爲4.
2、解題思路
特殊輸入:數組爲空的情況。
解決這道問題由以下兩種方法:
方法1:動態規劃。
分析:數組的最長遞增子序列可能以結尾,且一定是這個遞增子序列的長度最大的那個。
(1) 狀態定義
表示結尾的最長遞增子序列的長度。
(2) 狀態轉移
考慮和之間的關係,當,以結尾的最長遞增子序列的長度等於以結尾的最最長遞增子序列的長度加1,即
其中,
(3) 確定起始
只有開頭一個元素時,以該元素結尾的最長遞增子序列的長度爲1,即。
(4)確定結束
中的最大值即爲該數組的最長遞增子序列的長度。
3、代碼實現
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int len = nums.size();
if(len == 0){
return 0;
}
vector<int> dp(len, 0);
dp[0] = 1;
for(int i = 1; i < len; i++){
int maxdpj = -1;
for(int j = 0; j < i; j++){
if(nums[j] < nums[i]){
maxdpj = max(maxdpj, dp[j]);
}
}
if(maxdpj == -1){
dp[i] = 1;
}
else{
dp[i] = maxdpj + 1;
}
// cout<<"dp["<<i<<"]="<<dp[i]<<endl;
}
int maxlis = -1;
for(int i = 0; i < len; i++){
maxlis = max(maxlis, dp[i]);
}
return maxlis;
}
};