动态规划:
1 class Solution { 2 public int findNumberOfLIS(int[] nums) { 3 int maxLen=0,res=0; //maxLen:递增子序列的最大长度,res:maxLen长递增子序列的个数 4 int n=nums.length; 5 //dp[k][0]:以nums[k]为尾的子序列的最大长度 6 //dp[k][1]:以nums[k]为尾,dp[k][0]长的子序列的个数 7 int[][] dp=new int[n][2]; 8 for(int k=0;k<n;k++){ 9 dp[k][0]=dp[k][1]=1; //初始化 10 for(int i=k-1;i>=0;i--){ 11 if(nums[k]>nums[i]){ 12 if(dp[i][0]+1>dp[k][0]){ //存在更大长度,则更新最大长度及其个数 13 dp[k][0]=dp[i][0]+1; 14 dp[k][1]=dp[i][1]; 15 } 16 else if(dp[i][0]+1==dp[k][0]){ 17 dp[k][1]+=dp[i][1]; //存在相同最大长度,累计最大长度个数 18 } 19 } 20 } 21 if(maxLen<dp[k][0]) maxLen=dp[k][0]; //记录最大长度 22 } 23 for(int[] num:dp) res=num[0]==maxLen?res+num[1]:res; //计算最大长度总个数 24 return res; 25 } 26 }
p