如何打印实际的比特子序列?

时间:2015-07-16 18:37:30

标签: arrays algorithm

给定一个包含n个正整数的数组arr [0 ... n-1],如果arr []的子序列首先增加,然后减少,则称为Bitonic。编写一个以数组作为参数的函数,并返回最长的bitonic子序列的长度。

输入arr [] = {1,11,2,10,4,5,2,1}; 输出:6(长度为6的最长的比特子序列是1,2,10,4,2,1)

现在,为了找出长度,我首先计算LIS(Longest Inc.子序列)的长度,然后计算LDS的长度(最长Dec.子序列),然后遍历两个数组,同时执行{{1其中max(lis[i] + lds[i]-1)

i varies from 0 to (n-1)

现在,如果我被要求打印实际的比特子序列,我该怎么做?我想到的一种方法是找出最大值出现的索引。现在,我知道LIS和LDS在该索引处的值,然后,我从该索引打印LIS和LDS。但是,我无法正确地阐述这个想法。

1 个答案:

答案 0 :(得分:0)

你的想法是正确的。当您将最大长度计算为max(lis[i] + lds[i]-1)时,请存储实际最大值的i,其中序列从增加变为减少。我们称之为maxIndex

现在您可以按如下方式生成序列:

  • prev=maxIndex, i=maxIndex-1开始,按照索引减少的顺序向下搜索,直至找到lis[i]==lis[prev]-1 && arr[i] < arr[prev]
  • arr[i]存储在结果列表res中,设置prev=i,然后继续搜索数组
  • 到达lis[i]==1时停止。
  • 反转res列表
  • arr[maxIndex]添加到res
  • prev=maxIndex, i=maxIndex+1开始,然后向上移动数组,直至找到lds[i]==lis[prev]-1 && arr[i] < arr[prev]
  • arr[i]存储在结果列表res中,设置prev=i,然后继续搜索数组
  • 到达lds[i]==1时停止。

此方法使用lislds数组重建比特序列的两个部分。由于需要以相反的顺序检索序列的第一部分,因此需要颠倒从0到maxIndex的列表部分。