leetcode算法題-- 最長遞增子序列的個數★

原題鏈接:https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/
這題和最長上升子序列是一個類型,不過難了好多。最長上升子序列,只用找出最長的長度即可,而這裏需要找出所有最長的子序列的數量。題解中使用兩個數組,lengths[j]存儲以nums[j]爲終點的最長長度,counts[j]存儲length[j]的數目。於是首先兩層循環,判斷如果nums[i]>nums[j],如果lengths[i]>=lengths[j],則需要更新lengths[j]和counts[j],如果lengths[i]+1==lengths[j],那麼更新counts[j]+=counts[i]。最後將lengths中等於最長長度的相應位置的counts累加起來即可。
動態規劃

當nums[i]>nums[j]時
lengths[j]=lengths[i]; counts[j]=counts[i]; 當lengths[i]>=lengths[j]時
counts[j]+=counts[i];                       當lengths[i]+1==lengths[j]

代碼:

int findNumberOfLIS(vector<int>& nums) {
    int size=nums.size();
    vector<int> lengths(size,1);
    vector<int> counts(size,1);
    int max_len=0;
    for(int j=0;j<size;j++){
        for(int i=0;i<j;i++){
            if(nums[i]<nums[j]){
                if(lengths[i]>=lengths[j]){
                    lengths[j]=lengths[i]+1;
                    counts[j]=counts[i];
                }else if(lengths[i]+1==lengths[j]){
                    counts[j]+=counts[i];
                }
            }
        }
        max_len=max(max_len,lengths[j]);
    }
    int ans=0;
    for(int i=0;i<size;i++){
        if(max_len==lengths[i]){
            ans+=counts[i];
        }
    }
    return ans;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章