changeset 16:a4a917da5365

Implement recursive LISS with tracking
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 28 Feb 2023 13:37:49 +0100
parents be208ce0ffaf
children f6833e5295d6
files julia/dp.jl
diffstat 1 files changed, 14 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/julia/dp.jl	Tue Feb 28 12:52:34 2023 +0100
+++ b/julia/dp.jl	Tue Feb 28 13:37:49 2023 +0100
@@ -96,17 +96,24 @@
     c
 end
 
-function recursive_liss(v::AbstractVector{<:Integer}, last=-1000, i=1, l=0)::Int
+function recursive_liss(v::AbstractVector{<:Integer}, last=1, i=1, l=0, prev=zeros(Int, length(v)), L=zeros(Int, length(v)), Lmax=[0])::Int
     if i > length(v)
         return l
     else
-        if v[i] >= last
-            incl = recursive_liss(v, v[i], i+1, l+1)
-            excl = recursive_liss(v, last, i+1, l)
+        if v[i] >= v[last]
+            incl = recursive_liss(v, i, i+1, l+1, prev, L, Lmax)
+            excl = recursive_liss(v, last, i+1, l, prev, L, Lmax)
+            if incl >= excl
+                Lmax[1] = max(Lmax[1], incl)
+            end
+            if incl == Lmax[1]
+                L[l+1] = i
+                prev[i] = last
+            end
             max(incl, excl)
-        else # v[i] < last
-            incl = recursive_liss(v, v[i], i+1, 1)
-            excl = recursive_liss(v, last, i+1, l)
+        else # v[i] < v[last]
+            incl = recursive_liss(v, i, i+1, 1, prev, L, Lmax)
+            excl = recursive_liss(v, last, i+1, l, prev, L, Lmax)
             max(incl, excl)
         end
     end