Algorithm 使用";最长递增子序列算法(nlgn)";

Algorithm 使用";最长递增子序列算法(nlgn)";,algorithm,Algorithm,参考:我正在解决嵌套玩偶问题: 我写这部分是为了找到最长的递增子序列(nlgn版本)。例如,如果序列如下:1 2 3 1 2 1 我找到了最大的子序列:“1 2 3”,并将其从 原始序列。序列变为1 2 1 我找到最大的子序列:“12”,然后再次删除它。序列变为1 我找到最大的子序列:“1”,然后将其删除。序列变为空 所以答案是3,3个增加的子序列 我的问题是我得到了TLE(时间限制),我需要一种更好的方法来计算子序列。有一个关于使用“迪尔沃思定理”的提示,但我不知道如何应用它 算法 如果我理解

参考:我正在解决嵌套玩偶问题:

我写这部分是为了找到最长的递增子序列(nlgn版本)。例如,如果序列如下:1 2 3 1 2 1

  • 我找到了最大的子序列:“1 2 3”,并将其从 原始序列。序列变为1 2 1

  • 我找到最大的子序列:“12”,然后再次删除它。序列变为1

  • 我找到最大的子序列:“1”,然后将其删除。序列变为空

  • 所以答案是3,3个增加的子序列

    我的问题是我得到了TLE(时间限制),我需要一种更好的方法来计算子序列。有一个关于使用“迪尔沃思定理”的提示,但我不知道如何应用它

    算法 如果我理解正确的话,你是在试图找到可以打包每个玩偶的最小嵌套玩偶数量,你的算法是在每个阶段贪婪地制作最大的玩偶(最大的意思是它包含的碎片最多),然后重复,直到打包完所有玩偶

    换句话说,您正在从偏序集构造链

    说:

    任何反链中的最大元素数等于最小元素数 集合的任何分区中链的数目

    所以你可以通过计算单个反链中的元素来计算链的数量

    你可以用一种非常类似于你现在所做的方式来构建反链,通过按宽度降序排列玩偶,然后在高度范围内找到最长的递增子序列

    请注意,使用此方法,您可以通过测量反链的长度来获得答案,您只需要运行一次最长的递增子序列算法,因此应该会快得多

    例子 在您的(1,1)、(1,1)、(2,2)、(3,3)、(1,1)、(2,2)、(1,1)示例中,我们首先按宽度降序排序:

    (3, 3), 
    (2, 2), 
    (2, 2), 
    (1, 1), 
    (1, 1), 
    (1, 1), 
    (1, 1)
    
    然后提取高度:

    3,2,2,1,1,1,1
    
    然后找到最长的递增子序列(请注意,每个元素必须与前一个元素相同或更高,因此严格来说,您可以找到最长的非递减子序列):


    长度为4,因此答案为4。

    谢谢!你能举个小例子吗。例如,如果序列是(1,1),(1,1),(2,2),(3,3),(1,1),(2,2),(1,1),答案应该是4。最长的子序列长度为3。或者(1,1),(1,1),(1,1),(1,1),(1,1)答案是5,最长的子序列是5@nemo我已经在答案中添加了你的例子-这会让事情更清楚吗?非常感谢!!!我要实现它,如果我没有把事情做好,我会回到这里。1,1,1,1是一个“递增的子序列”吗?这些数字并没有增加。在3 2 1 1 1中,最长的递增子序列是2 3和1 2。
    1,1,1,1