LC.673 最长递增子序列的个数
public int findNumberOfLIS(int[] nums) {
//单串问题
if(nums==null || nums.length==0){
return 0;
}
int res=1;
int Counter[]=new int[nums.length];
Counter[0]=nums.length;
int dp[]=new int[nums.length];
int dpe[]=new int[nums.length];
for(int i=0;i<nums.length;i++){
dp[i]=1;
dpe[i]=1;
}
// dp[0]=1;
for(int i=0;i<nums.length;i++){
int MaxLen=1;//因为对于单个元素无论如何最低都是1了
for(int j=0;j<i;j++){//搜索前面O(n)种情况,因为他是不连续的,可以从前面的i个种作为他的上一个元素
if(nums[i]>nums[j]){//符合递增特点
MaxLen=Math.max(dp[j],MaxLen);
if(dp[j]+1>dp[i]){
dp[i]=dp[j]+1;
dpe[i]=dpe[j];
}else if(dp[j]+1==dp[i]){
dpe[i]+=dpe[j];
}
}
}
res=Math.max(dp[i],res);//刷新最大值
}
int ans=0;
for(int i=0;i<nums.length;i++){
if(dp[i]==res){
ans+=dpe[i];
}
}
return ans;
}和LC300大体思路一样,但是要统计重复字符串 重点再于维护dpe数组用于统计到达最大值时候的解法数,记得 是累计解法,也就是dpe[i]=dpe[lastA]+dpe[lastB....];
因为默认情况下最少有一种解法初始化为1,为该元素LIS长度为1时的解法。如果要更新长度了,说明原来的数据要清0
但是注意要是更新最大长度英国式dpe[i]=dpe[last]
https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/

