/**
* 给定一个未排序的整数数组,找到最长递增子序列的个数。
*
* 示例 1:
*
* 输入: [1,3,5,4,7]
* 输出: 2
* 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
* 示例 2:
*
* 输入: [2,2,2,2,2]
* 输出: 5
* 解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。
* 注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class Solution {
public:
int findNumberOfLIS(vector<int> &nums)
{
int size = nums.size();
int dp[size];
int cn[size];
int maxLen = 1;
int maxCnt = 0;
for (int i = 0; i < size; i++) {
dp[i] = 1;
int cnt = 1; // 记录i当前的最大递增序列个数
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
int tmp = dp[j] + 1;
if (dp[i] < tmp) { // 新的最大递增序列
dp[i] = tmp;
cnt = cn[j];
} else if (dp[i] == tmp) { // 又能组成最大递增序列
cnt += cn[j];
}
}
}
cn[i] = cnt;
if (maxLen < dp[i]) { // 新的最大长度
maxLen = dp[i];
maxCnt = cnt;
} else if (maxLen == dp[i]) { // 又一个最大长度
maxCnt += cnt;
}
}
return maxCnt;
}
};