public static Respuesta dp(int numero, int anterior) { if (dp[numero][anterior] != null) return dp[numero][anterior]; if (numero == 1) { Respuesta r = new Respuesta(); if (anterior == ODD) r.o = 1; else if (anterior == EVEN) r.e = 1; else if (anterior == IMAGINARY) r.i = 1; return dp[numero][anterior] = r.clonar(); } Respuesta mejor = null; for (int i : factores[numero]) { Respuesta r = dp(numero / i, (anterior + 1) % 3); if (anterior == ODD) { if (mejor == null || r.e <= mejor.e) mejor = r.clonar(); } else if (anterior == EVEN) { if (mejor == null || r.i <= mejor.i) mejor = r.clonar(); } else if (anterior == IMAGINARY) { if (mejor == null || r.o <= mejor.o) mejor = r.clonar(); } } if (primos[numero]) { Respuesta r = dp(numero + 1, (anterior + 1) % 3); if (anterior == ODD) { if (mejor == null || r.e < mejor.e) mejor = r.clonar(); } else if (anterior == EVEN) { if (mejor == null || r.i < mejor.i) mejor = r.clonar(); } else if (anterior == IMAGINARY) { if (mejor == null || r.o < mejor.o) mejor = r.clonar(); } } if (anterior == ODD) mejor.o = Math.min(numero, mejor.o); else if (anterior == EVEN) mejor.e = Math.min(numero, mejor.e); else if (anterior == IMAGINARY) mejor.i = Math.min(numero, mejor.i); return dp[numero][anterior] = mejor.clonar(); }
Respuesta clonar() { Respuesta nueva = new Respuesta(); nueva.o = o; nueva.i = i; nueva.e = e; return nueva; }