
/*
dp[i]表示以i下标结尾的最长严格递增子序列的长度,需要注意的是最后算出来的dp[i]才是以i下标结尾的
最长严格递增子序列的长度,中间运行过程中dp[i]并不是以i结尾的最长严格递增子序列的长度,
而是以i结尾的递增子序列的长度。
cnt[i]为考虑以nums[i]结尾的最长上升子序列的个数
那么在nums[i] > nums[j]前提下,
有两种情况:
(1)如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 > dp[i],说明找到了一个更长的递增子序列。
那么以j为结尾的子串的最长递增子序列的个数,就是最新的以i为结尾的子串的最长递增子序列的个数,
即:count[i] = count[j]。
(2)如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 == dp[i],说明找到了两个相同长度的递增子序列。
那么以i为结尾的子串的最长递增子序列的个数 就应该加上以j为结尾的子串的最长递增子序列的个数,
即:count[i] += count[j];
*/
class Solution {
public:
int findNumberOfLIS(vector<int>& nums) {
int n = nums.size();
if(n<=1)
return n;
vector<int> dp(n,1);
vector<int> cnt(n,1);
int maxval = -1;
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
if(nums[i] > nums[j]){
if(dp[i] < dp[j]+1)
cnt[i] = cnt[j];
else if(dp[i] == dp[j]+1)
cnt[i] = cnt[i] + cnt[j];
dp[i] = max(dp[i], dp[j]+1);
}
maxval = max(maxval,dp[i]);
}
}
int res = 0;;
for(int i = 0; i<n; i++){
// 如果以i结尾的递增子序列长度等于最大值,将以i即为的递增子序列个数进行累加
if(dp[i]==maxval)
res += cnt[i];
}
cout<<"res:"<<res<<endl;
return res;
}
};