Updating lazy-frog files
This commit is contained in:
BIN
edit-distance/arthur-dolival-edit-distance-tutorial.pdf
Normal file
BIN
edit-distance/arthur-dolival-edit-distance-tutorial.pdf
Normal file
Binary file not shown.
53
edit-distance/arthur-dolival-edit-distance-tutorial.tex
Normal file
53
edit-distance/arthur-dolival-edit-distance-tutorial.tex
Normal file
@@ -0,0 +1,53 @@
|
||||
\documentclass[10pt]{article}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage{amsmath,amsthm,amssymb}
|
||||
\usepackage{fullpage}
|
||||
\usepackage{url}
|
||||
\pagenumbering{gobble}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{graphicx}
|
||||
\input{statement/preamble.tex}
|
||||
|
||||
\title{ Tutorial: Distância de Edição}
|
||||
\author{}
|
||||
\date{}
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\section{Solução do Problema}
|
||||
|
||||
O problema de encontrar o menor número de operações para transformar uma string em outra, classicamente conhecido como Distância de Edição (\textit{Edit Distance}), pode ser resolvido de forma eficiente por meio de \textbf{programação dinâmica}.
|
||||
|
||||
\subsection{Definição do Subproblema}
|
||||
|
||||
Sejam $w_1$ e $w_2$ as duas strings de tamanhos $N$ e $M$, respectivamente.
|
||||
Definimos o nosso estado da programação dinâmica como:
|
||||
|
||||
$$dp[i][j] = \text{número mínimo de operações para transformar o sufixo } w_1[i \dots N-1] \text{ no sufixo } w_2[j \dots M-1].$$
|
||||
|
||||
Assim, $dp[0][0]$ representará a resposta final para as duas strings inteiras.
|
||||
|
||||
\subsection{Função de Transição}
|
||||
|
||||
Para determinar $dp[i][j]$, olhamos para os caracteres atuais $w_1[i]$ e $w_2[j]$ e tomamos uma decisão.
|
||||
|
||||
Se os caracteres forem iguais ($w_1[i] == w_2[j]$), não precisamos realizar nenhuma operação. Apenas avançamos na análise de ambas as strings:
|
||||
|
||||
$$dp[i][j] = dp[i+1][j+1]$$
|
||||
|
||||
Se os caracteres forem diferentes ($w_1[i] \neq w_2[j]$), temos três opções de edição. Avaliamos o resultado de aplicar cada uma delas e escolhemos a que produz o menor custo final. Cada operação tem um custo de $1$:
|
||||
|
||||
$$dp[i][j] = 1 + \min \begin{cases}
|
||||
dp[i+1][j] & \text{(Remoção do caractere } w_1[i]\text{)} \\
|
||||
dp[i+1][j+1] & \text{(Substituição de } w_1[i] \text{ por } w_2[j]\text{)} \\
|
||||
dp[i][j+1] & \text{(Inserção do caractere } w_2[j] \text{ em } w_1\text{)}
|
||||
\end{cases}$$
|
||||
|
||||
\subsection{Casos Base}
|
||||
|
||||
Os casos base ocorrem quando esgotamos os caracteres de uma das strings (ou seja, quando $i$ ou $j$ ultrapassam os limites):
|
||||
|
||||
Se consumirmos toda a string $w_1$ ($i \ge N$), mas ainda restarem caracteres em $w_2$, a única forma de igualá-las é \textbf{inserir} todos os $M - j$ caracteres restantes:
|
||||
$$dp[N][j] = M - j$$
|
||||
|
||||
Da mesma forma, se consumirmos toda a string $w_2$ ($j \ge M$), mas ainda restarem caracteres em $w_1$, a única forma de igualá-las é \textbf{remover} todos os $N - i$ caracteres que sobraram:
|
||||
$$dp[i][M] = N - i$$\end{document}
|
||||
BIN
edit-distance/arthur-dolival-edit-distance.pdf
Normal file
BIN
edit-distance/arthur-dolival-edit-distance.pdf
Normal file
Binary file not shown.
43
edit-distance/arthur-dolival-edit-distance.tex
Normal file
43
edit-distance/arthur-dolival-edit-distance.tex
Normal file
@@ -0,0 +1,43 @@
|
||||
\documentclass{maratona}
|
||||
|
||||
\begin{document}
|
||||
\begin{ProblemaAutor}{}{Distância de Edição}{1}{256}{}
|
||||
|
||||
O problema consiste em determinar o \textbf{menor número de operações} necessárias para transformar uma string em outra.
|
||||
|
||||
As operações permitidas são as seguintes:
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{Inserção}: inserir um caractere em qualquer posição;
|
||||
\item \textbf{Remoção}: remover um caractere de qualquer posição;
|
||||
\item \textbf{Substituição}: substituir um caractere por outro.
|
||||
\end{itemize}
|
||||
|
||||
O objetivo é calcular o menor custo possível para converter completamente uma dada string inicial em uma string final, utilizando apenas essas operações.
|
||||
|
||||
\Entrada
|
||||
|
||||
A entrada consiste de duas linhas:
|
||||
|
||||
\begin{itemize}
|
||||
\item A primeira linha contém dois inteiros \( n \) e \( m \) (\( 1 \leq n, m \leq 500 \)), representando os tamanhos das strings.
|
||||
\item A segunda linha contém duas strings \( s_1 \) e \( s_2 \), ambas compostas apenas por letras minúsculas e com tamanhos exatos \( n \) e \( m \), respectivamente.
|
||||
\end{itemize}
|
||||
|
||||
\Saida
|
||||
|
||||
Imprima um único inteiro representando o \textbf{menor número de operações} necessárias para transformar \( s_1 \) em \( s_2 \).
|
||||
|
||||
\ExemploEntrada
|
||||
|
||||
\begin{Exemplo}
|
||||
\texttt{7~7} & \texttt{3}\\
|
||||
\texttt{estouro~calouro} & \\
|
||||
\rowcolor{gray!20}\texttt{11~8} & \texttt{7}\\
|
||||
\rowcolor{gray!20}\texttt{aniquilacao~intencao} & \\
|
||||
\end{Exemplo}
|
||||
|
||||
|
||||
|
||||
\end{ProblemaAutor}
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user