leetcode486 (ganador previsto: programación dinámica)

Dada una matriz de números enteros no negativos que representan puntuaciones. El jugador 1 toma una puntuación de cualquier extremo de la matriz, luego el jugador 2 continúa obteniendo la puntuación de cualquier extremo de la matriz restante, y luego el jugador 1 toma, .... 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 asumir que el juego de cada jugador maximizará su puntuación.

Ejemplo 1:
Entrada: [1, 5, 2]
Salida: Falso

Solución (1): De forma recursiva, registre la diferencia entre los puntos de los dos jugadores, y al mismo tiempo distinga el orden de los dos jugadores.Cuando cada jugador puntúe, asegúrese de que su puntuación sea máxima.

class Solution {
    
    
     public boolean PredictTheWinner(int[] nums){
    
    
        return compare(0,nums.length-1,nums,1)>=0;
    }
     /*
      * start和end记录剩余没有被选取的数组分数段。 
      * int turn表示两个玩家的顺序,1表示第一个玩家选分,2表示第二个玩家选分
      */
    private int compare(int start,int end,int[]nums,int turn) {
    
    
          if(start==end){
    
    
              return nums[start]*turn;
          }
          int startPoint=nums[start]*turn+compare(start+1,end,nums,-turn);
          int endPoint=nums[end]*turn+compare(start,end-1,nums,-turn);
          //保证当前选分的玩家所选取的分数所选取的分数最大化
          return Math.max(startPoint*turn,endPoint*turn)*turn;
    }
}

Complejidad de tiempo: O (2 ^ n), donde n es la longitud de la matriz.
Complejidad espacial: O (n), donde n es la longitud de la matriz. La complejidad del espacio depende del espacio de pila utilizado por la recursividad

Solución del problema (dos): programación dinámica, establezca una matriz bidimensional int [] [] dp, dp [i] [j] para representar la máxima diferencia de puntuación entre los dos jugadores en el segmento de la matriz desde el i-ésimo al j-ésimo número de la matriz.

class Solution {
    
    
    public boolean PredictTheWinner(int[] nums){
    
    
        int len=nums.length;
        int [][]dp=new int[len][len];
        for(int i=0;i<len;i++)
            dp[i][i]=nums[i];
        for(int j=1;j<len;j++)
            for(int i=0;i+j<len;i++){
    
    
                /*
                 * 得到最大的分数差。
                 * 由于当前玩家选择后,另一个玩家选择分数时时会让两人之间分数差减小,
                 * 所以是减号(nums[i]-dp[i+1][i+j]、nums[i+j]-dp[i][i+j-1])
                 */
                dp[i][i+j]=Math.max(nums[i]-dp[i+1][i+j],nums[i+j]-dp[i][i+j-1]);
            }
        return dp[0][len-1]>=0;
   }
   
}

Complejidad temporal: O (n ^ 2)
Complejidad espacial: O (n)

Supongo que te gusta

Origin blog.csdn.net/CY2333333/article/details/108351933
Recomendado
Clasificación