首页 > 其他 > 详细

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

时间:2019-12-22 20:38:11      阅读:103      评论:0      收藏:0      [点我收藏+]

技术分享图片

动态规划: 反向查找。

 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

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

原文:https://www.cnblogs.com/NiBosS/p/12080716.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!