diff --git a/min-sum-path-2d/min-sum-path-2d-tutorial.pdf b/min-sum-path-2d/min-sum-path-2d-tutorial.pdf new file mode 100644 index 0000000..40a779d Binary files /dev/null and b/min-sum-path-2d/min-sum-path-2d-tutorial.pdf differ diff --git a/min-sum-path-2d/min-sum-path-2d-tutorial.tex b/min-sum-path-2d/min-sum-path-2d-tutorial.tex new file mode 100644 index 0000000..300e41e --- /dev/null +++ b/min-sum-path-2d/min-sum-path-2d-tutorial.tex @@ -0,0 +1,80 @@ +\documentclass[10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage{amsmath,amsthm,amssymb} +\usepackage{fullpage} +\usepackage{url} +\pagenumbering{gobble} +\usepackage{hyperref} + +\title{ Tutorial: Caminho de Menor Soma} +\author{} +\date{} +\begin{document} +\maketitle +\section{Solução do Problema} + +O problema consiste em encontrar o \textbf{menor custo} necessário para percorrer uma grade (\textit{matriz}) de inteiros positivos. +A grade possui \( n \) linhas e \( m \) colunas, e cada célula contém um número positivo que representa o custo de passar por ela. + +O objetivo é sair da célula \textbf{superior esquerda} da grade e chegar à célula \textbf{inferior direita}, movendo-se apenas para a \textbf{direita} ou para \textbf{baixo}. +A soma dos valores das células visitadas deve ser a menor possível. + +Este problema pode ser resolvido de forma eficiente utilizando \textbf{programação dinâmica}. + +\subsection{Definição do Subproblema} + +Seja uma matriz de custos \( C \) de tamanho \( n \times m \). Definimos: + +\[ +dp[i][j] = \text{o menor custo para chegar à célula } (i,j) \text{ a partir de } (0,0). +\] + +Ou seja, \( dp[i][j] \) representa o custo mínimo para alcançar exatamente a posição \( (i, j) \). + +\subsection{Função de Transição} + +Como só é possível mover-se para a \textbf{direita} ou para \textbf{baixo}, a célula \( (i,j) \) só pode ser alcançada a partir de: + +\begin{itemize} + \item \( (i-1, j) \): movimento vindo de \textbf{cima}; + \item \( (i, j-1) \): movimento vindo da \textbf{esquerda}. +\end{itemize} + +Assim, o custo mínimo para chegar a \( (i,j) \) é dado por: + +\[ +dp[i][j] = C[i][j] + \min(dp[i-1][j],\ dp[i][j-1]). +\] + +\subsection{Casos Base} + +\begin{itemize} + \item Primeira célula: + \[ + dp[0][0] = C[0][0] + \] + \item Primeira linha (somente movimentos para a direita): + \[ + dp[0][j] = dp[0][j-1] + C[0][j] + \] + \item Primeira coluna (somente movimentos para baixo): + \[ + dp[i][0] = dp[i-1][0] + C[i][0] + \] +\end{itemize} + +\subsection{Construção da Tabela} + +Após inicializar os casos base, preenchermos o restante da matriz \( dp \) utilizando: + +\[ +dp[i][j] = C[i][j] + \min(dp[i-1][j],\ dp[i][j-1]). +\] + +Ao término do processo, o valor da última posição: + +\[ +dp[n-1][m-1] +\] + +representa o \textbf{menor custo possível} para ir da célula inicial até a célula final.\end{document} diff --git a/min-sum-path-2d/min-sum-path-2d.pdf b/min-sum-path-2d/min-sum-path-2d.pdf index 1993289..25c8456 100644 Binary files a/min-sum-path-2d/min-sum-path-2d.pdf and b/min-sum-path-2d/min-sum-path-2d.pdf differ diff --git a/min-sum-path-2d/min-sum-path-2d.tex b/min-sum-path-2d/min-sum-path-2d.tex index 336d92d..8d8dcf8 100644 --- a/min-sum-path-2d/min-sum-path-2d.tex +++ b/min-sum-path-2d/min-sum-path-2d.tex @@ -33,5 +33,61 @@ Imprima um único inteiro representando o menor custo total para ir da célula s -\end{ProblemaAutor} +\Notas + +\begin{itemize} + + \item \textbf{Exemplo 1} + \[ + n = 1,\quad m = 1,\quad + C = + \begin{bmatrix} + 5 + \end{bmatrix} + \] + Como há apenas uma célula, o caminho consiste apenas nela. + O menor custo é: + \[ + 5 + \] + + \item \textbf{Exemplo 2} + \[ + n = 2,\quad m = 2,\quad + C = + \begin{bmatrix} + 1 & 3 \\ + 2 & 4 + \end{bmatrix} + \] + Os caminhos possíveis são: + \begin{itemize} + \item Direita → Baixo: \( 1 + 3 + 4 = 8 \) + \item Baixo → Direita: \( 1 + 2 + 4 = 7 \) + \end{itemize} + Logo, o menor custo é: + \[ + 7 + \] + + \item \textbf{Exemplo 3} + \[ + n = 3,\quad m = 3,\quad + C = + \begin{bmatrix} + 1 & 2 & 3 \\ + 4 & 5 & 6 \\ + 7 & 8 & 9 + \end{bmatrix} + \] + O movimento sempre aumenta o custo, portanto o caminho ótimo é seguir pela primeira linha e depois descer: + \[ + 1 + 2 + 3 + 6 + 9 = 21 + \] + Assim, o menor custo para ir de \((0,0)\) a \((2,2)\) é: + \[ + 21 + \] + +\end{itemize}\end{ProblemaAutor} \end{document} diff --git a/min-sum-path-2d/statement/tutorial.tex b/min-sum-path-2d/statement/tutorial.tex index e69de29..cb88e9d 100644 --- a/min-sum-path-2d/statement/tutorial.tex +++ b/min-sum-path-2d/statement/tutorial.tex @@ -0,0 +1,67 @@ +\section{Solução do Problema} + +O problema consiste em encontrar o \textbf{menor custo} necessário para percorrer uma grade (\textit{matriz}) de inteiros positivos. +A grade possui \( n \) linhas e \( m \) colunas, e cada célula contém um número positivo que representa o custo de passar por ela. + +O objetivo é sair da célula \textbf{superior esquerda} da grade e chegar à célula \textbf{inferior direita}, movendo-se apenas para a \textbf{direita} ou para \textbf{baixo}. +A soma dos valores das células visitadas deve ser a menor possível. + +Este problema pode ser resolvido de forma eficiente utilizando \textbf{programação dinâmica}. + +\subsection{Definição do Subproblema} + +Seja uma matriz de custos \( C \) de tamanho \( n \times m \). Definimos: + +\[ +dp[i][j] = \text{o menor custo para chegar à célula } (i,j) \text{ a partir de } (0,0). +\] + +Ou seja, \( dp[i][j] \) representa o custo mínimo para alcançar exatamente a posição \( (i, j) \). + +\subsection{Função de Transição} + +Como só é possível mover-se para a \textbf{direita} ou para \textbf{baixo}, a célula \( (i,j) \) só pode ser alcançada a partir de: + +\begin{itemize} + \item \( (i-1, j) \): movimento vindo de \textbf{cima}; + \item \( (i, j-1) \): movimento vindo da \textbf{esquerda}. +\end{itemize} + +Assim, o custo mínimo para chegar a \( (i,j) \) é dado por: + +\[ +dp[i][j] = C[i][j] + \min(dp[i-1][j],\ dp[i][j-1]). +\] + +\subsection{Casos Base} + +\begin{itemize} + \item Primeira célula: + \[ + dp[0][0] = C[0][0] + \] + \item Primeira linha (somente movimentos para a direita): + \[ + dp[0][j] = dp[0][j-1] + C[0][j] + \] + \item Primeira coluna (somente movimentos para baixo): + \[ + dp[i][0] = dp[i-1][0] + C[i][0] + \] +\end{itemize} + +\subsection{Construção da Tabela} + +Após inicializar os casos base, preenchermos o restante da matriz \( dp \) utilizando: + +\[ +dp[i][j] = C[i][j] + \min(dp[i-1][j],\ dp[i][j-1]). +\] + +Ao término do processo, o valor da última posição: + +\[ +dp[n-1][m-1] +\] + +representa o \textbf{menor custo possível} para ir da célula inicial até a célula final. \ No newline at end of file