673. 最长递增子序列的个数(动态规划)

动态规划: 反向查找。

 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

猜你喜欢

转载自www.cnblogs.com/NiBosS/p/12080716.html