diff --git a/decode-ways/decode-ways-tutorial.pdf b/decode-ways/decode-ways-tutorial.pdf index 2100c40..a3286f7 100644 Binary files a/decode-ways/decode-ways-tutorial.pdf and b/decode-ways/decode-ways-tutorial.pdf differ diff --git a/decode-ways/decode-ways-tutorial.tex b/decode-ways/decode-ways-tutorial.tex index f798665..9ea2b7c 100644 --- a/decode-ways/decode-ways-tutorial.tex +++ b/decode-ways/decode-ways-tutorial.tex @@ -13,7 +13,15 @@ \maketitle O problema pode ser resolvido utilizando uma abordagem de \textbf{programação dinâmica}, na qual calculamos, passo a passo, o número de formas possíveis de decodificar a sequência até cada posição. -A ideia é que cada dígito (ou par de dígitos consecutivos) da sequência pode representar uma letra do alfabeto latino, desde que o valor correspondente esteja entre $1$ e $26$. Assim, precisamos contar todas as maneiras válidas de interpretar a sequência numérica. +\subsection*{Modelagem} + +Cada dígito (ou par de dígitos consecutivos) da sequência pode representar uma letra do alfabeto latino, seguindo a regra: +\[ +1 \rightarrow A, \quad 2 \rightarrow B, \quad \ldots, \quad 26 \rightarrow Z +\] +Portanto, precisamos contar todas as maneiras válidas de interpretar a sequência numérica, considerando que apenas combinações entre $1$ e $26$ são válidas. + +\subsection*{Definição da DP} Definimos uma estrutura de DP com dois estados para cada posição $i$: \begin{itemize} @@ -21,31 +29,44 @@ Definimos uma estrutura de DP com dois estados para cada posição $i$: \item $dp[i][1]$: número de mensagens possíveis terminando no caractere $i$ \textbf{quando o dígito atual é concatenado} com o anterior. \end{itemize} -A transição entre os estados é definida da seguinte forma: -\begin{itemize} - \item Se o dígito atual $s[i]$ está entre $1$ e $9$, ele pode ser interpretado como uma letra individual. Logo: - \[ - dp[i][0] = dp[i - 1][0] + dp[i - 1][1] - \] - \item Se a combinação dos dois últimos dígitos $s[i-1]s[i]$ forma um número entre $10$ e $26$, então esses dois dígitos podem ser interpretados como uma única letra: - \[ - dp[i][1] = dp[i - 2][0] + dp[i - 2][1] - \] -\end{itemize} +\subsection*{Função de Transição} -A base da recorrência é: +A função de transição é definida da seguinte forma: +\[ +dp[i][0] = +\begin{cases} +dp[i - 1][0] + dp[i - 1][1], & \text{se } 1 \leq s[i] \leq 9 \\[6pt] +0, & \text{caso contrário} +\end{cases} +\] + +\[ +dp[i][1] = +\begin{cases} +dp[i - 2][0] + dp[i - 2][1], & \text{se } 10 \leq 10 \cdot s[i-1] + s[i] \leq 26 \\[6pt] +0, & \text{caso contrário} +\end{cases} +\] + +\subsection*{Casos Base} + +Os casos base são: \[ dp[0][0] = 1, \quad dp[0][1] = 0, \quad dp[1][0] = 1, \quad dp[1][1] = 0 \] -pois antes de processar qualquer caractere há exatamente uma maneira “vazia” de formar uma mensagem válida, e o primeiro dígito pode, no máximo, representar uma única letra isolada. +Isso ocorre porque, antes de processar qualquer caractere, há exatamente uma maneira “vazia” de formar uma mensagem válida, e o primeiro dígito pode, no máximo, representar uma única letra isolada. -O resultado final é dado pela soma: +\subsection*{Resposta Final} +O total de formas possíveis de decodificar a sequência é dado por: \[ dp[n][0] + dp[n][1] \] - onde $n$ é o comprimento da sequência de entrada. -Essa solução possui complexidade de tempo e espaço $O(n)$, podendo ser otimizada para $O(1)$ espaço se armazenarmos apenas os últimos dois estados necessários para o cálculo. -\end{document} +\subsection*{Complexidade} + +\begin{itemize} + \item \textbf{Tempo:} $O(n)$, pois cada caractere é processado uma única vez; + \item \textbf{Espaço:} $O(n)$, podendo ser otimizado para $O(1)$ ao armazenar apenas os últimos dois estados. +\end{itemize}\end{document} diff --git a/decode-ways/decode-ways.pdf b/decode-ways/decode-ways.pdf index 75881b1..064d24b 100644 Binary files a/decode-ways/decode-ways.pdf and b/decode-ways/decode-ways.pdf differ diff --git a/decode-ways/statement/tutorial.tex b/decode-ways/statement/tutorial.tex index fe2dc74..dcf09d6 100644 --- a/decode-ways/statement/tutorial.tex +++ b/decode-ways/statement/tutorial.tex @@ -1,6 +1,14 @@ O problema pode ser resolvido utilizando uma abordagem de \textbf{programação dinâmica}, na qual calculamos, passo a passo, o número de formas possíveis de decodificar a sequência até cada posição. -A ideia é que cada dígito (ou par de dígitos consecutivos) da sequência pode representar uma letra do alfabeto latino, desde que o valor correspondente esteja entre $1$ e $26$. Assim, precisamos contar todas as maneiras válidas de interpretar a sequência numérica. +\subsection*{Modelagem} + +Cada dígito (ou par de dígitos consecutivos) da sequência pode representar uma letra do alfabeto latino, seguindo a regra: +\[ +1 \rightarrow A, \quad 2 \rightarrow B, \quad \ldots, \quad 26 \rightarrow Z +\] +Portanto, precisamos contar todas as maneiras válidas de interpretar a sequência numérica, considerando que apenas combinações entre $1$ e $26$ são válidas. + +\subsection*{Definição da DP} Definimos uma estrutura de DP com dois estados para cada posição $i$: \begin{itemize} @@ -8,30 +16,44 @@ Definimos uma estrutura de DP com dois estados para cada posição $i$: \item $dp[i][1]$: número de mensagens possíveis terminando no caractere $i$ \textbf{quando o dígito atual é concatenado} com o anterior. \end{itemize} -A transição entre os estados é definida da seguinte forma: -\begin{itemize} - \item Se o dígito atual $s[i]$ está entre $1$ e $9$, ele pode ser interpretado como uma letra individual. Logo: - \[ - dp[i][0] = dp[i - 1][0] + dp[i - 1][1] - \] - \item Se a combinação dos dois últimos dígitos $s[i-1]s[i]$ forma um número entre $10$ e $26$, então esses dois dígitos podem ser interpretados como uma única letra: - \[ - dp[i][1] = dp[i - 2][0] + dp[i - 2][1] - \] -\end{itemize} +\subsection*{Função de Transição} -A base da recorrência é: +A função de transição é definida da seguinte forma: +\[ +dp[i][0] = +\begin{cases} +dp[i - 1][0] + dp[i - 1][1], & \text{se } 1 \leq s[i] \leq 9 \\[6pt] +0, & \text{caso contrário} +\end{cases} +\] + +\[ +dp[i][1] = +\begin{cases} +dp[i - 2][0] + dp[i - 2][1], & \text{se } 10 \leq 10 \cdot s[i-1] + s[i] \leq 26 \\[6pt] +0, & \text{caso contrário} +\end{cases} +\] + +\subsection*{Casos Base} + +Os casos base são: \[ dp[0][0] = 1, \quad dp[0][1] = 0, \quad dp[1][0] = 1, \quad dp[1][1] = 0 \] -pois antes de processar qualquer caractere há exatamente uma maneira “vazia” de formar uma mensagem válida, e o primeiro dígito pode, no máximo, representar uma única letra isolada. +Isso ocorre porque, antes de processar qualquer caractere, há exatamente uma maneira “vazia” de formar uma mensagem válida, e o primeiro dígito pode, no máximo, representar uma única letra isolada. -O resultado final é dado pela soma: +\subsection*{Resposta Final} +O total de formas possíveis de decodificar a sequência é dado por: \[ dp[n][0] + dp[n][1] \] - onde $n$ é o comprimento da sequência de entrada. -Essa solução possui complexidade de tempo e espaço $O(n)$, podendo ser otimizada para $O(1)$ espaço se armazenarmos apenas os últimos dois estados necessários para o cálculo. +\subsection*{Complexidade} + +\begin{itemize} + \item \textbf{Tempo:} $O(n)$, pois cada caractere é processado uma única vez; + \item \textbf{Espaço:} $O(n)$, podendo ser otimizado para $O(1)$ ao armazenar apenas os últimos dois estados. +\end{itemize} \ No newline at end of file