This is a variant of the longest increasing subsequence problem. Suppose that, instead of wanting to find a sequence or counting how many sequences there are, you wanted to identify items that can be part of some longest increasing sequence.
For example, in the list 1,2,4,3,0,5
all items except the zero can be part of a longest increasing subsequence.
What is a strategy to find these items? How efficiently can it be done?
One method is to use the same dynamic algorithm as in the longest increasing subsequence problem, keeping track of the best item to precede the
i
'th item assuming it was the last item, but tweak it to keep track of ties. Then, after the best preceding items are known for every item, determine which items are reachable via that graph when starting from the top scoring items.In the case of the example,
1,2,4,3,0,5
, it would work like this:1
is at index 0, so give it a lis score of 1 with no previous index2
can be preceded by1
, so2
gets a lis score of 1+1=2 and a previous index of 04
can be preceded by2
and1
, but2
has a better lis score so4
gets a lis score of 2+1=3 and a previous index of 13
can be also preceded by2
and1
, and again2
has a better lis score so3
gets a lis score of 2+1=3 and a previous index of 10
can't be preceded by anything, so it gets a lis score of 1 with no previous index5
can be preceded by any of the other items, but3
and4
have the best lis scores (=3) so5
gets a lis score of 3+1=4 with previous indexes of 2 or 3.Now we take the top scoring items, just
5
in this case, and iteratively search backwards for items that can precede it. This will mark5
,3
,4
,2
and1
(but not0
) as can-be-in-longest-sequence.This definitely runs in
O(n^2)
time, and I think by being clever it can be made to work inO(n lg n)
time.The main challenge for going from quadratic time is not making an explicit graph with 'can optimally precede' edges. A list like
1,1,1,1,1,1,...,2,2,2,2,2,2,...
has a quadratic number of edges, so you need to avoid storing them all or exploring them all.