AMR11A - Magic Grid

214 visualizações

Publicada em

Resolução do Problema AMR11A - Magic Grid com programação dinâmica.

Publicada em: Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
214
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
1
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

AMR11A - Magic Grid

  1. 1. AMR11A - Magic Grid Mauro Roberto Costa - maurorcsc@gmail.com
  2. 2. Problema AMR11A - Magic Grid http://www.spoj.com/problems/AMR11A/
  3. 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. 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. 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. 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)
  7. 7. Programação Dinâmica
  8. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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]
  22. 22. Obrigado

×