Dynamic programming
When going over the lab7b I wanted to understan more clearly how to identity patterns and similarties to other problems and when to use dynamic programming.
A subsequence of a sequence like a and array, a linked list, or a string, is obtained by removing zero or more elements and keeping the rest in the same sequence order. It is also called a substring if the elements are contiguous in the original sequence.
Working on the examples:
- Given an array \(A[1...n]\) of integers, compute the length of a longest increasing subsequence of \(A\). A sequence \(B[1...\ell]\) is increasing if \(B[i] > B[i - 1]\) for every index \(i \geq 2\).
\[ LIS(i, j) = \begin{cases} 0 & \text{if } j > n \\ LIS(i, j + 1) & \text{if } j \leq n \text{ and } A[i] \geq A[j] \\ \max \{LIS(i, j + 1), 1 + LIS(j, j+1)\} & \text{ otherwise} \end{cases} \]
% This quicksort algorithm is extracted from Chapter 7, Introduction to Algorithms (3rd edition) \begin{algorithm} \caption{Longest Increasing Subsequence} \begin{algorithmic} \PROCEDURE{LIS}{$A[1 \cdots n]$} \STATE $A[0] \gets - \infty$ \FOR{$i \gets 0$ \TO $n$} \STATE LIS$[i, n + 1] \gets 0$ \ENDFOR \FOR{$j \gets n$ down \TO $1$} \FOR{$i \gets j - 1$ down \TO $0$} \IF{$A[i] \geq A[j]$} \STATE LIS$[i, j] \gets$ LIS$[i, j + 1]$ \ELSE \STATE LIS$[i, j] \gets \max \{LIS[i, j+1], 1 + LIS[j, j+1]\}$ \ENDIF \ENDFOR \ENDFOR \STATE return LIS$[0, 1]$ \ENDPROCEDURE \end{algorithmic} \end{algorithm}