https://leetcode.com/problems/number-of-longest-increasing-subsequence/description/
Given an unsorted array of integers, find the number of longest increasing subsequence.
Example 1:
Input: [1,3,5,4,7]
Output: 2
Explanation: The two longest increasing subsequence are [1, 3, 4, 7] and [1, 3, 5, 7].
Example 2:
Input: [2,2,2,2,2]
Output: 5
Explanation: The length of longest continuous increasing subsequence is 1, and there are 5 subsequences’ length is 1, so output 5.
解体思路:
dp[i]表示最长的回文子序列,通过数组 cnt[ ] 来记录dp[i]每个值出现的情况数
状态转移方程:
dp[i] = dp[j]+1 ,cnt[i]=cnt[j] if(dp[j]+1>dp[i]&&nums[j]>nums[i]) if(nums[j]>nums[i]) (0<j<i)
cnt[i] +=cnt[j] if(dp[j]+1==dp[i])
public class Number_of_Longest_Increasing_Subsequence_673 {
/**
* dp[i] 表示到数组第i个位置的最长上升子序列的长度
* cnt[i] 表示到数组第i个位置的最长上升子序列的长度的情况的数量
*
* 边界
* dp[0]=1
* cnt[0]=1
*
* 状态转移方程
* dp[i] = max(dp[j]+1,dp[i]) if(nums[i]>nums[j]) 0<j<i
*
* if(dp[j]+1>dp[i]) cnt[i] = cnt[j]
* if(dp[j]+1==dp[i]) cnt[i] +=cnt[j]
*
* @param nums
* @return
*/
public int findNumberOfLIS(int[] nums) {
if(nums==null||nums.length==0)return 0;
int n = nums.length;
int[] dp = new int[n];
int[] cnt = new int[n];
int max = 1;
int res = 0;
for(int i=0;i<n;i++){
dp[i] = 1;
cnt[i] = 1;
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
if(dp[j]+1>dp[i]){
dp[i] = dp[j] + 1;
cnt[i] = cnt[j];
}else if(dp[j]+1==dp[i]){
cnt[i] += cnt[j];
}
}
max = Math.max(dp[i], max);
}
}
for(int i=0;i<nums.length;i++){
if(dp[i]==max)res+=cnt[i];
}
return res;
}
public static void main(String[] args) {
System.out.println(new Number_of_Longest_Increasing_Subsequence_673().findNumberOfLIS(new int[]{1,3,5,4,7}));
}
}