原題鏈接: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;
}