code: def _lcs(p, l):
          
          # Dynamic Programming Finding LCS
          if len(p) == 0:
              return 0
          P = np.array(list(p)).reshape((1, len(p)))
          L = np.array(list(l)).reshape((len(l), 1))
          M = np.ndarray(shape=(len(P), len(L)), dtype=np.int32)
          for i in range(M.shape[0]):
              for j in range(M.shape[1]):
                  up = 0 if i == 0 else M[i-1, j]
                  left = 0 if j == 0 else M[i, j-1]
  
                  if i == 0 or j == 0:
                      M[i, j] = max(up, left, M[i, j])
                  else:
                      M[i, j] = M[i, j] + M[i - 1, j - 1]
          return M.max()
docs: Calculates the Longest Common Subsequence between p and l (both list of int) and returns its length