Un ladrón entra en una colonia de casas numeradas del 1 al n. Cada casa tiene un número impreso en la parte superior. Ese número es la cantidad de dinero dentro de esa casa. Sin embargo, hay una restricción. Si el ladrón roba la i-ésima casa, no puede robar house no i-1 y house no i + 1. ¿Cómo puede el ladrón maximizar su robo?

Esta es una pregunta de programación dinámica. A primera vista, parece que el ladrón podría robar cualquier otra casa, en cuyo caso, le preguntamos si debería comenzar con la primera o la segunda; Esto podría maximizar el número de casas que roba. Sin embargo, es posible que ninguna de estas posibilidades maximice la cantidad de dinero que robaría (por ejemplo, las casas 1 y 4 tienen un millón de dólares cada una, y el resto no tiene dinero).

Idea de algoritmo: si solo hubiera casas [matemáticas] k [/ matemáticas], ¿cuánto dinero podría ganar el ladrón? Calcule esto para [matemáticas] k = 1, 2, 3,… n [/ matemáticas] (en ese orden): este cálculo será rápido, ya que cada paso solo requiere una pequeña cantidad de trabajo.

Sea [math] M (k) [/ math] la cantidad de dinero en la casa [math] k [/ math] th, y [math] P (k) [/ math] sea la cantidad máxima de dinero que puede hacer si consideramos solo las primeras casas [matemáticas] k [/ matemáticas]. Entonces tenemos:

  • [matemáticas] P (0) = 0 [/ matemáticas]
  • [matemáticas] P (1) = M (1) [/ matemáticas]
  • [matemáticas] P (k) = \ max (P (k-2) + M (k), P (k-1)) [/ matemáticas] (primer caso = robar la casa [matemáticas] k [/ matemáticas] , y alguna combinación de la primera [matemática] k-2 [/ matemática], segundo caso = no robar [matemática] k [/ matemática] th casa, y robar alguna combinación de la primera [matemática] k-1 [ /matemáticas]). Mantenga un registro de estas decisiones.

Una vez que ha calculado [matemáticas] P (n) [/ matemáticas], ha encontrado la cantidad máxima de dinero que puede robar, y si ha rastreado las decisiones que lo llevaron allí (cuál de las [matemáticas] M (k ) [/ math] se agregaron), ya sabes qué casas robar.

Como ya se mencionó en otras respuestas, esto es lo mismo que la suma máxima, de modo que no hay dos elementos adyacentes .

El algoritmo es [matemática] O (n) [/ matemática] complejidad de tiempo y O (1) complejidad de espacio, muy similar al algoritmo de Kadane para el problema de suma máxima de subarreglos .

El algoritmo verifica si el elemento ith está en posición impar o par, y en consecuencia encuentra el valor máximo hasta ese punto, es decir, ya sea incluyendo el elemento ith y el elemento máximo de matriz hasta (i - 2)th , o el máximo hasta (i - 1)th elemento.

  sum [i] = max (suma [i - 1], suma [i - 2] + números [i])

Calcule esto para las posiciones pares e impares en la matriz, nums e imprima el máximo de las dos sumas, evenmax y oddmax .

  int rob (vector  y números) {
         int evenmax = 0, oddmax = 0, sz = nums.size ();
         para (int i = 0; i 

import java.util.Scanner;

clase pública MaximiseRobbery {

public static void main (String [] args) {

Scanner scan = nuevo escáner (System. In );

int houses = scan.nextInt ();

int [] amPerHouse = newint [casas];

para (int i = 0; i

amPerHouse [i] = scan.nextInt ();

}

int maximumRobbery = maximizarRobbery (amPerHouse, casas);

Sistema. out .println (maximumRobbery);

scan.close ();

}

/ **

* Método para maximizar el robo

* @param amPerHouse

* /

private static int maximizarRobbery (int [] amPerHouse, int houses) {

if (casas == 1) {

return amPerHouse [0];

} else if (casas == 2) {

volver matemáticas. max (amPerHouse [0], amPerHouse [1]);

}

int [] dp = newint [amPerHouse.length];

dp [0] = amPerHouse [0];

dp [1] = amPerHouse [1];

para (int i = 2; i

dp [i] = Matemáticas. max (dp [i – 2] + amPerHouse [i], dp [i – 1]);

}

return dp [casas – 1];

}

}

b 5 o;

El problema es simplemente encontrar la suma máxima en una matriz de modo que no haya dos elementos seleccionados adyacentes. Esto se puede resolver mediante programación dinámica utilizando el algoritmo descrito aquí. Suma máxima de modo que no haya dos elementos adyacentes. GeeksforGeeks