O documento descreve um problema de programação dinâmica para encontrar o valor mínimo de energia necessária para Harry Potter completar sua jornada através de uma grade mágica e encontrar a Pedra Filosofal. A solução envolve preencher uma matriz auxiliar considerando os valores da grade a cada passo, retornando a solução na célula inicial.
3. Descrição do Problema
Ajude Harry Potter a encontrar a Pedra Filosofal. Você receberá uma Magic Grid
com R linhas e C colunas. Cada célula pode possuir um dragão, que fará o Harry
gastar energia para derrotá-lo, ou uma poção, que aumentará a energia de Harry.
Se sua energia cair para 0 ou menos durante a jornada, Harry morrerá. A jornada
é iniciada na célula (1,1) e Harry só pode mover para direita ou para baixo, para a
célula (i+1, j) ou (i, j+1). A Pedra Filosofal encontra-se na célula (R, C).
4. Entrada
A entrada do problema é composta por um inteiro T indicando o número de casos
de testes. Para cada caso de teste são dados os valores R e C, que representam
o número de linhas e colunas da Magic Grid, respectivamente. A descrição da
Magic Grid é dada em R linhas com C inteiros. Células (i, j) < 0 contêm dragão, as
demais possuem poção.
5. Saída
A saída é composta por T linhas, uma para cada caso de teste, contendo o valor
mínimo de energia que Harry precisa começar na célula (1,1) para conseguir
completar a jornada até a célula (R,C).
6. Solução Recursiva
rec(i, j):
se i = R e j = C então:
retorne 1
senão:
c1 <- c2 <- INFINITO
se i+1 < R então:
c1 <- max(rec(i+1, j)-M[i][j], 1)
se j+1 < C então:
c2 <- max(rec(i, j+1)-M[i][j], 1)
retorne min(c1, c2)
8. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M Matriz S
A matriz M representa a Matriz de Entrada do problema. A Matriz S é uma matriz auxiliar ou
Matriz de Solução. O preenchimento da matriz S será realizado da direita para esquerda, de
baixo para cima.
9. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
1
Matriz S
A célula (R,C) da Matriz de Solução é preenchida com 1, porque é necessário que Harry possua
pelo menos 1 de energia ao chegar no final.
10. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
1
Matriz S
Para cada posição na linha R (da direita para a esquerda), se S[R][j+1] - M[R][j] > 0, S[R][j] =
S[R][j+1] - M[R][j]. Caso contrário, o valor de S[R][j+1] = 1.
11. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
3 1
Matriz S
Para cada posição na linha R (da direita para a esquerda), se S[R][j+1] - M[R][j] > 0, S[R][j] =
S[R][j+1] - M[R][j]. Caso contrário, o valor de S[R][j+1] = 1.
12. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
3 1
Matriz S
Para cada posição na linha R (da direita para a esquerda), se S[R][j+1] - M[R][j] > 0, S[R][j] =
S[R][j+1] - M[R][j]. Caso contrário, o valor de S[R][j+1] = 1.
13. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
2 3 1
Matriz S
Para cada posição na linha R (da direita para a esquerda), se S[R][j+1] - M[R][j] > 0, S[R][j] =
S[R][j+1] - M[R][j]. Caso contrário, o valor de S[R][j+1] = 1.
14. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
2 3 1
Matriz S
Para cada posição na coluna C (de baixo para cima), se S[i+1][C] - M[i][C] > 0, S[i][C] = S[i+1][C] -
M[i][C]. Caso contrário, o valor de S[i+1][C] = 1.
15. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
4
2 3 1
Matriz S
Para cada posição na coluna C (de baixo para cima), se S[i+1][C] - M[i][C] > 0, S[i][C] = S[i+1][C] -
M[i][C]. Caso contrário, o valor de S[i+1][C] = 1.
16. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
4
2 3 1
Matriz S
Para cada posição de (R-1, C-1) até (1,1), encontra-se o menor entre S[i+1][j] e S[i][j+1]. Se o
menor - M[i][j] > 0, S[i][j] = menor - M[i][j]. Caso contrário, S[i][j] = 1.
17. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
2 4
2 3 1
Matriz S
Para cada posição de (R-1, C-1) até (1,1), encontra-se o menor entre S[i+1][j] e S[i][j+1]. Se o
menor - M[i][j] > 0, S[i][j] = menor - M[i][j]. Caso contrário, S[i][j] = 1.
18. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
2 4
2 3 1
Matriz S
Para cada posição de (R-1, C-1) até (1,1), encontra-se o menor entre S[i+1][j] e S[i][j+1]. Se o
menor - M[i][j] > 0, S[i][j] = menor - M[i][j]. Caso contrário, S[i][j] = 1.
19. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
2 2 4
2 3 1
Matriz S
Para cada posição de (R-1, C-1) até (1,1), encontra-se o menor entre S[i+1][j] e S[i][j+1]. Se o
menor - M[i][j] > 0, S[i][j] = menor - M[i][j]. Caso contrário, S[i][j] = 1.
20. Preenchimento da Matriz
0 1 -3
1 -2 0
Matriz M
2 2 4
2 3 1
Matriz S
A solução do problema encontra-se na célula (1,1) da matriz.
21. Pseudocódigo da Solução
DP():
S[R][C] <- 1
para i de C-1 até 1 faça:
se S[R][i+1] - M[R][i] > 0 então:
S[R][i] <- S[R][i+1] - M[R][i]
senão:
S[R][i] <- 1
para j de R-1 até 1 faça:
se S[j+1][C] - M[j][C] > 0 então:
S[j][C] <- S[j+1][C] - M[j][C]
senão:
S[j][C] <- 1
para i de R-1 até 0 faça:
para j de C-1 até 0 faça:
menor <- min(S[i+1][j], S[i][j+1])
se menor - M[i][j] > 0 então:
S[i][j] <- menor - M[i][j]
senão:
s[i][j] <- 1
retorne S[1][1]