[Notas diarias de Leetcode] 877. Stone Game / 486. Predicción de ganadores (Python)

tema

La idea de resolver los dos problemas es la misma.

Juego de piedras 877.

Alex y Lee están jugando con montones de piedras. Los montones de piedras pares están dispuestos en una fila, y cada montón tiene un número entero positivo de piedras [i].

El juego lo decide quién tiene más piedras. El número total de piedras es impar, por lo que no hay empate.

Alex y Lee se turnan y Alex comienza primero. En cada ronda, el jugador toma toda la pila de piedras desde el principio o al final de la fila.
Esta situación continúa hasta que no queden más montones de piedras, momento en el que gana el jugador con más piedras en la mano.

Suponiendo que tanto Alex como Lee están en su mejor momento, devuelva verdadero cuando Alex gana el juego y falso cuando Lee gana el juego.

Ejemplo:

Entrada: [5,3,4,5] Salida: verdadero Explicación: Alex comienza primero y solo puede tomar las primeras 5 o las últimas 5 piedras. Supongamos que tomó los primeros 5, esta línea se convierte en
[ 3, 4, 5 ]. Si Lee toma los primeros 3, entonces el resto es [4,5], y Alex toma los últimos 5 y gana 10 puntos. Si Lee toma los últimos 5
, entonces el restante es [3,4], y Alex toma los últimos 4 y gana 9 puntos. Esto muestra que tomar las primeras 5 piedras es un movimiento ganador para Alex, por lo que volvemos
verdaderos.

inmediato:

2 <= piles.length <= 500
piles.length 是偶数。
1 <= piles[i] <= 500
sum(piles) 是奇数。

486. Predecir el ganador

Dada una matriz de números enteros no negativos que representan puntuaciones. Elige un jugador de cualquier extremo de una matriz de una fracción, seguido por 2 jugadores continuar para recoger la fracción restante de cualquier extremo de la matriz y, a continuación, tomar un jugador, ......
. Un jugador solo puede obtener una puntuación a la vez, y la puntuación ya no está disponible una vez que se toma. El juego termina cuando no quedan puntos para ganar. El jugador con más puntos totales gana.

Dada una serie de puntos, predice si el jugador 1 será el ganador. Puede suponer que la jugabilidad de cada jugador maximizará su puntuación.

Ejemplo 1:

Entrada: [1, 5, 2] Salida: Falsa Explicación: Al principio, el jugador 1 puede elegir entre 1 y 2. Si elige 2 (o 1), entonces el jugador 2 puede elegir entre
1 (o 2) y 5. Si el jugador 2 elige 5, entonces el jugador 1 solo tiene 1 (o 2) para elegir. Por lo tanto, la puntuación final del jugador 1 es
1 + 2 = 3, y la puntuación final del jugador 2 es 5. Por lo tanto, el jugador 1 nunca será el ganador y se devuelve False.

Ejemplo 2:

Entrada: [1, 5, 233, 7] Salida: Verdadero Explicación: El jugador 1 elige 1 al principio. Luego, el jugador 2 debe elegir entre 5 y 7. No importa qué jugador
2 elija, el jugador 1 puede elegir 233.
Al final, el jugador 1 (234 puntos) obtiene más puntos que el jugador 2 (12 puntos), por lo que devuelve Verdadero, lo que significa que el jugador 1 puede ser el ganador.

inmediato:

1 <= 给定的数组长度 <= 20.
数组里所有分数都为非负数且不会大于 10000000 。
如果最终两个玩家的分数相等,那么玩家 1 仍为赢家。

Ideas para resolver problemas

Programación dinámica

Interpretación : El título requiere que cada jugador solo pueda tomar desde el principio o el final de la matriz actual, lo que significa que la submatriz debe ser continua y no habrá espacios en relación con la matriz original.

Definición de estado

Defina una matriz bidimensional dp, el número de filas y columnas es igual al número de pilas de piedras, dp [i] [j] significa que cuando las pilas restantes de piedras son del subíndice i al subíndice j, el jugador actual y el valor máximo de la diferencia en el número de piedras de otro jugador Tenga en cuenta que el jugador actual no es necesariamente el primer Alex.

Ecuación de transición de estado

Solo cuando i <= j, las pilas restantes de piedras son significativas, por lo que cuando i> j, dp [i] [j] = 0;
cuando i = j, solo queda una pila de piedras, y el jugador actual solo puede tomar lejos de este montón de piedras, por lo que para todos los 0≤i≤len (nums), hay dp [i] [j] = nums [i];
cuando i <j, el jugador actual puede elegir tomar nums [i] o nums [j], entonces es el turno de otro jugador para tomar las piedras de la pila de piedras restante. En las dos opciones, el jugador actual elegirá la mejor opción para maximizar el número de piedras. Por lo tanto, se puede obtener la ecuación de transición de estado:, dp[i][j]=max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1])finalmente juzgue el valor de dp [0] [- 1], si es mayor que 0, entonces el número de piedras de Alex es mayor que el de Lee, devuelve Verdadero, de lo contrario devuelve Falso.
Inserte la descripción de la imagen aquí

Soy estúpido*

Siempre gana primero. . .

Código

class Solution:
    def stoneGame(self, piles: List[int]) -> bool:
        l = len(piles)
        dp = [[0]*l for _ in range(l)]
        for i in range(l):
            dp[i][i] = piles[i]
        for i in range(l-2,-1,-1):
            for j in range(i+1,l):
                dp[i][j] = max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1])
        return dp[0][-1]>=0
class Solution:
    def stoneGame(self, piles: List[int]) -> bool:
        return True

Supongo que te gusta

Origin blog.csdn.net/qq_36477513/article/details/112183125
Recomendado
Clasificación