"""
Author  : Mehdi ALAOUI

This is a pure Python implementation of Dynamic Programming solution to the longest increasing subsequence of a given sequence.

The problem is  :
Given an ARRAY, to find the longest and increasing sub ARRAY in that given ARRAY and return it.
Example: [10, 22, 9, 33, 21, 50, 41, 60, 80] as input will return [10, 22, 33, 41, 60, 80] as output
"""


def longestSub(ARRAY):  # This function is recursive

    ARRAY_LENGTH = len(ARRAY)
    if (
        ARRAY_LENGTH <= 1
    ):  # If the array contains only one element, we return it (it's the stop condition of recursion)
        return ARRAY
        # Else
    PIVOT = ARRAY[0]
    isFound = False
    i = 1
    LONGEST_SUB = []
    while not isFound and i < ARRAY_LENGTH:
        if ARRAY[i] < PIVOT:
            isFound = True
            TEMPORARY_ARRAY = [element for element in ARRAY[i:] if element >= ARRAY[i]]
            TEMPORARY_ARRAY = longestSub(TEMPORARY_ARRAY)
            if len(TEMPORARY_ARRAY) > len(LONGEST_SUB):
                LONGEST_SUB = TEMPORARY_ARRAY
        else:
            i += 1

    TEMPORARY_ARRAY = [element for element in ARRAY[1:] if element >= PIVOT]
    TEMPORARY_ARRAY = [PIVOT] + longestSub(TEMPORARY_ARRAY)
    if len(TEMPORARY_ARRAY) > len(LONGEST_SUB):
        return TEMPORARY_ARRAY
    else:
        return LONGEST_SUB


# Some examples

print(longestSub([4, 8, 7, 5, 1, 12, 2, 3, 9]))
print(longestSub([9, 8, 7, 6, 5, 7]))