\section{Solução do Problema}

O problema da maior subsequência comum (\textit{Longest Common Subsequence}, LCS) pode ser resolvido por meio de \textit{programação dinâmica}.  
A ideia central é decompor o problema em subproblemas menores, de forma que a solução ótima final seja construída a partir das soluções ótimas desses subproblemas.

\subsection{Definição do Subproblema}

Sejam duas strings \( s_1 \) e \( s_2 \), de tamanhos \( n \) e \( m \), respectivamente.  
Definimos:

\[
dp[i][j] = \text{o comprimento da maior subsequência comum entre } s_1[1..i] \text{ e } s_2[1..j].
\]

Isto é, \( dp[i][j] \) representa a resposta do problema considerando apenas os primeiros \( i \) caracteres de \( s_1 \) e os primeiros \( j \) caracteres de \( s_2 \).

\subsection{Função de Transição}

Ao analisar um par de posições \( (i, j) \), temos duas possibilidades principais:

\begin{itemize}
    \item Se os caracteres atuais são iguais, isto é, \( s_1[i] = s_2[j] \), então podemos estender uma subsequência comum encontrada anteriormente:
    \[
    dp[i][j] = dp[i-1][j-1] + 1.
    \]

    \item Caso contrário, não é possível usar ambos os caracteres ao mesmo tempo, então devemos escolher o melhor resultado entre ignorar um dos dois:
    \[
    dp[i][j] = \max(dp[i-1][j], \, dp[i][j-1]).
    \]
\end{itemize}

Assim, a função de transição pode ser resumida como:

\[
dp[i][j] =
\begin{cases}
dp[i-1][j-1] + 1, & \text{se } s_1[i] = s_2[j] \\
\max(dp[i-1][j], \, dp[i][j-1]), & \text{caso contrário}
\end{cases}
\]

\subsection{Casos Base}

Os casos base seguem a lógica natural do problema:

\[
dp[0][j] = 0 \quad \forall j \ge 0
\]
\[
dp[i][0] = 0 \quad \forall i \ge 0
\]

Isto representa que, se uma das strings tiver tamanho zero, nenhuma subsequência comum pode ser formada.