给定一个包含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。但是,我无法正确地阐述这个想法。
答案 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
时停止。此方法使用lis
和lds
数组重建比特序列的两个部分。由于需要以相反的顺序检索序列的第一部分,因此需要颠倒从0到maxIndex
的列表部分。