feat: new statement files. Generator generated. New TLE solution

This commit is contained in:
2025-12-03 20:44:14 -03:00
parent bf6ef948b9
commit 6542a90f82
118 changed files with 296 additions and 6 deletions

View File

@@ -0,0 +1,54 @@
\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.