最长增加子序列的数量[重复]

Posted

技术标签:

【中文标题】最长增加子序列的数量[重复]【英文标题】:Number of Longest increasing subsequence [duplicate] 【发布时间】:2014-02-26 15:51:13 【问题描述】:

我需要返回数组中LIS的个数。

伪代码示例:

if the arr is
 int []arr = 2,4,90,-3,-2,-1,-10,-9,-8;
num of LIS is: 3
 2,4,90
 -3,-2,-1
 -10,-9,-8

示例 2:

arr [] = 2,-3,4,90,-2,-1,-10,-9,-8;
num of LIS is: 4
2,4,90
-3,4,90
-3,-2,-1
-10,-9,-8

我已经尝试过这样做:

int [] A = 2,4,90,-3,-2,-1,-10,-9,-8;
    int[] dp = new int[A.length];

    for (int i = 0; i < A.length; i++) 
        dp[i] = 1;

        for (int j = 0; j <= i - 1; j++) 
            if (A[j] < A[i]) 
                dp[i] = dp[i] + dp[j];
            
        
        System.out.println(dp[dp.length - 1] ) ;
    

【问题讨论】:

你遇到了什么问题? 你应该尝试找到最小值,然后分配它 你可以在二次时间里暴力破解这个。 @Zom-B 您可以在线性时间内找到所有个完整递增的子序列,因为每个子序列都在前一个子序列结束后开始。没有必要“从头开始”来找到下一个递增的子序列,这将使它成为二次时间。 *** 不是为你做作业的网站。这不是问题,这是事实清单。 【参考方案1】:

在您的代码中,您只需继续添加到 dp[i] 以用于内部 for 循环中的所有查找。理想情况下,您应该找到所有位置 (j

int maxSizeOfSubseq = 0;
for (int i = 0; i < A.length; i++) 
    dp[i] = 1;
    maxSizeOfSubseq = 0;
    for (int j = 0; j <= i - 1; j++) 
        if (A[j] < A[i] && dp[j] > maxSizeOfSubseq ) 
            maxSizeOfSubseq = dp[j];
        
    
    dp[i] = dp[i] + maxSizeOfSubseq ;
             System.out.println(dp[dp.length - 1] ) ;



// Now find the Max Size Of Subsequence amongst all computes subsequence lengths
maxSizeOfSubseq  = 0;
for(int count = 0 ; count < dp.length; ++count)

  if(dp[i] > maxSizeOfSubseq )
  
  maxSizeOfSubseq  = dp[i]
  


return maxSizeOfSubseq ;

【讨论】:

它不起作用..以 arr [] = 2,-3,4,90,-2,-1,-10,-9,-8 为例;需要返回 4 方法返回 3 你确定应该是4吗?对我来说,看起来有 3 个增加的子序列,所有长度为 3、2 和 3:-3、4、90; -2,-1; -10、-9、-8。 [2,4,90] , [-3,4,90] , [ -3,-2,-1] , [ -10,-9,-8] 谢谢但是..它仍然无法正常工作.. 您正在混合示例。我也只看到 3 个子序列。请说明要使用的数据。 @agamoti 你面临什么问题..你尝试调试它吗?

以上是关于最长增加子序列的数量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

最长连续不重复子序列

51nod 1376 最长递增子序列的数量(线段树)

51nod 1376: 最长递增子序列的数量(二维偏序+cdq分治)

51nod1376 最长递增子序列的数量

51NOD1376最长递增子序列的数量

51nod 1376 最长递增子序列的数量