Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2024/2025

Ayuda del ejercicio 3 del tema 5.3

Sea máximoPremio(i) el máximo premio que el jugador puede obtener con las partidas desde la i hasta la n - 1, ambas inclusive. El resultado que nos piden es máximoPremio(0).

Para obtener máximoPremio(i) el jugador tiene que decidir si participa o no en la partida i y elegir la mejor de las dos opciones:

Escribe las ecuaciones recursivas para calcular máximoPremio(i) siguiendo ese razonamiento, y después comprueba el resultado pulsando el enlace "Más ayuda".

Por supuesto, tu solución debe funcionar correctamente con datos diferentes, no solamente con el primer ejemplo del enunciado.

Más ayuda

Por ejemplo, con estos datos del enunciado:

partida012345678
inicio101113151617171818
final141817171919181919
premio7000300090005000800020004000100006000
primeraPosterior3755-1-17-1-1

podríamos hacer los siguientes cálculos:

máximoPremio(0) = max(7000 + máximoPremio(3),  // Si participa en la 0 puede pasar a la 3
                      máximoPremio(1))         // Si no participa en la 0 puede pasar a la 1

máximoPremio(1) = max(3000 + máximoPremio(7),  // Si participa en la 1 puede pasar a la 7
                      máximoPremio(2))         // Si no participa en la 1 puede pasar a la 2

máximoPremio(2) = max(9000 + máximoPremio(5),  // Si participa en la 2 puede pasar a la 5
                      máximoPremio(3))         // Si no participa en la 2 puede pasar a la 3

máximoPremio(3) = max(5000 + máximoPremio(5),  // Si participa en la 3 puede pasar a la 5
                      máximoPremio(4))         // Si no participa en la 3 puede pasar a la 4

máximoPremio(4) = max(8000,                    // Si participa en la 4 no puede pasar a ninguna
                      máximoPremio(5))         // Si no participa en la 4 puede pasar a la 5

máximoPremio(5) = max(2000,                    // Si participa en la 5 no puede pasar a ninguna
                      máximoPremio(6))         // Si no participa en la 5 puede pasar a la 6

máximoPremio(6) = max(4000 + máximoPremio(7),  // Si participa en la 6 puede pasar a la 7
                      máximoPremio(7))         // Si no participa en la 6 puede pasar a la 7

máximoPremio(7) = max(10000,                   // Si participa en la 7 no puede pasar a ninguna
                      máximoPremio(8))         // Si no participa en la 7 puede pasar a la 8

máximoPremio(8) = 6000                         // Caso base
	

Observa que sería un error decir máximoPremio(4) = 8000.

Observa también que hay cálculos que se repiten, y de ahí el interés de añadir una tabla para guardar resultados.

Antes de seguir leyendo, intenta escribir tú las ecuaciones generales, a partir de este ejemplo.

Más ayuda (2)

// Caso general:
Si i < n - 1 y competición[i].primeraPosterior != -1,
   máximoPremio(i) = max(competición[i].premio + máximoPremio(competición[i].primeraPosterior),
                         máximoPremio(i+1))

// Caso especial:
Si i < n - 1 y competición[i].primeraPosterior == -1,
   máximoPremio(i) = max(competición[i].premio,
                         máximoPremio(i+1))

// Caso base:
Si i == n - 1,
   máximoPremio(i) = competición[i].premio
	

Con esas ecuaciones, el problema que nos pìden resolver consiste en calcular máximoPremio(0).