feat: new tutorial file
This commit is contained in:
BIN
min-sum-path-2d/min-sum-path-2d-tutorial.pdf
Normal file
BIN
min-sum-path-2d/min-sum-path-2d-tutorial.pdf
Normal file
Binary file not shown.
80
min-sum-path-2d/min-sum-path-2d-tutorial.tex
Normal file
80
min-sum-path-2d/min-sum-path-2d-tutorial.tex
Normal file
@@ -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}
|
||||||
Binary file not shown.
@@ -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}
|
\end{document}
|
||||||
|
|||||||
@@ -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.
|
||||||
Reference in New Issue
Block a user