elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Bottom up
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Bottom up  (Leído 1,578 veces)
prosebas

Desconectado Desconectado

Mensajes: 17


Ver Perfil
Bottom up
« en: 26 Septiembre 2022, 03:09 am »

Buenas noches, tengo un problema en el que basicamente se me pide encontrar la cadena mas larga de vecinos que esten ordenados en donde los elementos adyacentes de una matriz NXN tienen una diferencia de +1.

Ejemplo:  

10  16  15  12
9     8    7   13
2     5    6   14
3     4    1   11

Para la anterior matriz la solucion seria  S = <2,3,4,5,6,7,8,9,10>, se me pide basicamente desarrollar el backtracking pero para llegar al bactracking debo seguir una serie de pasos:
1) Sol recursiva ingenua
2) Memoizacion
3) Bottom-up
4) Backtracking


Mi problema es a la hora de implementar el bottom-up, se supone que debo quitar las recursiones por ciclos para que sea de forma iterativa, sin embargo, no he podido implementarlo de esa forma.

No se si porfa me puedan dar alguna idea para solucionarlo con Bottom-up.

Código
  1. unsigned int naive(vec T, unsigned int i, unsigned int j) {
  2.  unsigned int _max = 0;
  3.  if (T.empty())
  4.    return 0;
  5.  else {
  6.    if (i < T.size() - 1 and T[i][j] == T[i + 1][j] + 1)
  7.      _max = max(_max, naive(T, i + 1, j));
  8.    if (j < T.size() - 1 and T[i][j] == T[i][j + 1] + 1)
  9.      _max = max(_max, naive(T, i, j + 1));
  10.    if (i > 0 and T[i][j] - 1 == T[i - 1][j])
  11.      _max = max(_max, naive(T, i - 1, j));
  12.    if (j > 0 and T[i][j] - 1 == T[i][j - 1])
  13.      _max = max(_max, naive(T, i, j - 1));
  14.  }
  15.  return _max + 1;
  16. }
  17.  

Código
  1. unsigned int memo(vec T, vec &M, unsigned int i, unsigned int j) {
  2.  unsigned int _max = 0;
  3.  if (T.empty())
  4.    return 0;
  5.  if (M[i][j] != 0)
  6.    return M[i][j];
  7.  else {
  8.    if (i < T.size() - 1 and T[i][j] == T[i + 1][j] + 1)
  9.      _max = max(_max, memo(T, M, i + 1, j));
  10.    if (j < T.size() - 1 and T[i][j] == T[i][j + 1] + 1)
  11.      _max = max(_max, memo(T, M, i, j + 1));
  12.    if (i > 0 and T[i][j] - 1 == T[i - 1][j])
  13.      _max = max(_max, memo(T, M, i - 1, j));
  14.    if (j > 0 and T[i][j] - 1 == T[i][j - 1])
  15.      _max = max(_max, memo(T, M, i, j - 1));
  16.    M[i][j] = _max + 1;
  17.  }
  18.  
  19.  return M[i][j];
  20. }
  21.  
  22.  

Las dos implementaciones anteriores son las que hice ingenuamente y con memoizacion


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Top-Down o Bottom-up?
Programación General
16BITBoy 5 4,976 Último mensaje 21 Julio 2010, 22:14 pm
por 16BITBoy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines