3n bloques de pizza

darle una pizza, que se compone de piezas de distintos tamaños bloques 3n, ahora usted y sus amigos tiene que seguir las siguientes reglas para dividir la pizza:

Usted escoge cualquier pizza.
Alice se seleccionará a una pizza de su elección a la izquierda de la pizza.
Bob escogerá una pizza en el Pizza sentido horario a elegir.
Repita el proceso hasta que no hay pizza a la izquierda.
El tamaño de cada pizza sentido horario indicado por la serie circular de las rebanadas.

Por favor, devuelva el valor máximo de la suma del tamaño de su pizza disponibles.

 

Ejemplo 1:

 

De entrada: rebanadas = [1,2,3,4,5,6]
de salida: 10
Explicación: la selección del tamaño de la pizza 4, Alice y Bob cada tamaño de selección de la pizza 3 y 5. tamaño de la pizza a continuación, elegir el tamaño de la pizza 6, Alice y Bob se seleccionan 2 y 1. El tamaño total de la pizza que se obtiene es 4 + 6 = 10.
Ejemplo 2:

 

De entrada: rebanadas = [8,9,8,6,1,1]
de salida: 16
Explicación: dos se seleccionan tamaño de pizza de 8. Si elige el tamaño de la pizza 9, tus amigos elegirán para el tamaño de la pizza 8, usted resume este caso no es la mejor.
Ejemplo 3:

De entrada: rebanadas = [4,1,2,5,8,3,1,9,7]
de salida: 21
Ejemplo 4:

De entrada: rebanadas = [3,1,2]
de salida: 3
 

consejos:

1 <= slices.length <= 500
slices.length% 3 == 0
1 <= rebanadas [i] <= 1000

 

Pensando: Este problema es equivalente a encontrar el máximo y más grandes sub-secuencias no son adyacentes, debido a que la matriz es circular, y por lo tanto no se puede ajustar en adyacente a un primer número que comprende un primer número y no contiene tanto situación

Tomando el máximo de ambos

dp lineal, el conjunto de fractura: Algoritmo

 

const  int N = 510 ; 



clase Solution {
 público :
     int f [N] [N / 3 ], g [N] [N / 3 ];
    int maxSizeSlices (vector < int > & rebanadas) {
         int n = slices.size (); 
        
        f [ 1 ] [ 1 ] = rebanadas [ 0 ];
        para ( int i = 2 ; i <= n- 1 ; i ++ ) {
             para ( int j = 1 ; j <= n / 3 ; j ++) { 
                F [i] [j] = max (f [i- 1 ] [j], f [i- 2 ] [j- 1 ] + rebanadas [i- 1 ]); 
            } 
        } 
        
        Para ( int i = 2 ; i <= n; i ++ ) {
             para ( int j = 1 ; j <= n / 3 ; j ++ ) { 
                g [i] [j] = max (g [i- 1 ] [j], g [i- 2 ] [j- 1 ] + rebanadas [i- 1 ]); 
            } 
        } 
        Int ans = max (f [n- 1 ] [n /3 ], g [n] [n / 3 ]);
        volver ans; 
    } 
};

 

 

...

Supongo que te gusta

Origin www.cnblogs.com/gulangyuzzz/p/12561268.html
Recomendado
Clasificación