Pregunta diaria·verano [AcWing 3583] Agrupación de enteros

tema

AcWing 3583 Agrupación de enteros
dados n enteros a 1 , a 2 , … , an a_1,a_2,…,a_na1,a2,,an.
Ahora, seleccione algunos números de ellos y agrupe los números seleccionados.

Requerir:

  1. Los números seleccionados se dividen en k grupos como máximo (al menos 1 grupo).
  2. En el mismo grupo , el valor absoluto de la diferencia entre dos números cualesquiera no excede de 5.
  3. Elija tantos como sea posible.

Disculpe, ¿cuántos números se pueden seleccionar para agrupar como máximo?
 

formato de entrada

La primera línea contiene dos números enteros n y k.
La segunda línea contiene n enteros a 1 , a 2 , … , an a_1,a_2,…,a_na1,a2,,an

formato de salida

Muestra un entero que representa el número máximo de enteros que se pueden seleccionar.
 

rango de datos

1 ≤ k ≤ norte ≤ 5000 1≤k≤n≤50001knorte5 0 0 0 ,
1 ≤ ai ≤ 1 0 9 1≤a_i≤10^91ayo1 09
 

Ejemplo de entrada 1:

5 2
1 2 15 15 15

Ejemplo de salida 1:

5

Ejemplo de entrada 2:

6 1
36 4 1 25 9 16

Ejemplo de salida 2:

2

Ejemplo de entrada 3:

4 4
1 10 100 1000

Ejemplo de salida 3:

4

tren de pensamiento

En primer lugar, todos los números se pueden ordenar.
Primero, veamos las propiedades de la solución óptima.
Para poder usar dp, debe ser una secuencia, y aquí hay un conjunto. Veamos cómo convertirlo en una secuencia aquí.

Se puede encontrar que la solución óptima puede tener las siguientes propiedades:

  1. Para dos números, si se cumple la condición (la diferencia es menor que 5), entonces se debe agregar el número del medio a este grupo (ya sea opcional o no), porque si cada grupo cumple la condición solo se basa en el valor máximo y el valor mínimo Si el valor cumple con los requisitos no tiene nada que ver con el valor intermedio, por lo que para la solución óptima, todo debe agregarse a la solución.
  2. ¿Habrá superposición de intervalos en la solución óptima? La solución óptima puede tener intervalos superpuestos, pero, por ejemplo, si dos grupos tienen intervalos superpuestos, se pueden dividir en dos grupos sin intervalos superpuestos y aun así satisfacer la solución óptima, por lo que es posible que la solución óptima no tenga intervalos superpuestos.
  3. Para el último segmento, en la solución óptima, este conjunto puede ser lo más largo posible. (Esta propiedad se usa principalmente para la transición de estado)
    inserte la descripción de la imagen aquí
    Es decir, el azul es la solución óptima original. Ajustamos los dos grupos seleccionados y dividimos la parte del grupo anterior que satisface el último grupo, de modo que la solución óptima sigue siendo satisfecho, y el último grupo es lo más largo posible. El número de elementos seleccionados no ha cambiado.

Por lo tanto, podemos encontrar la solución óptima en el subconjunto de este conjunto que satisfaga las propiedades anteriores.La solución óptima debe existir en este subconjunto, y cuando se cumplen las propiedades anteriores, se puede usar dp para resolverlo. inserte la descripción de la imagen aquí
Este tipo de subselección es una selección sección por sección, luego es una secuencia una por una, por lo que puede usar dp para hacerlo.

Podemos usar f ( i , j ) f(i,j)f ( yo ,j ) para representar el estado, el conjunto que representa es de1 − i 1-i1eligejj de iUn conjunto de todos los esquemas en el grupo j , el atributo representado por el número almacenado es el número máximo de elementos en los esquemas de este conjunto.
Para el cálculo del estado, particionamos el conjunto.
Dividido en1 − i 1-i1Seleccionarii de iyo y no elijoiiyo dos subconjuntos.
Por no seleccionar el ítemiiEn el caso de i , entonces el atributo (es decir, el número máximo) que toma este conjunto esf [ i − 1 ] [ j ] f[i-1][j]f [ yo1 ] [ j ]
Para eliiEn el caso de i , de acuerdo con las propiedades anteriores, el último intervalo puede ser lo más grande posible. inserte la descripción de la imagen aquí
Debe elegir el último grupo, por lo que el valor máximo es mirar al frente.
Entonces el valor máximo esf [ k − 1 ] [ j − 1 ] + ( i − k + 1 ) f[k - 1][j - 1] + (i - k + 1)f [ k1 ] [ j1 ]+( yok+1 ) Encuentra kk
aquík se puede escanear con dos punteros.
Luego tome el valor máximo de los dos casos.

Entonces la respuesta final es f [ n ] [ m ] f[n][m]El valor de f [ n ] [ m ] , aquí dividido enmm¿Es el grupo m óptimo? dondemetro < norte metro < nortemetro<n , puede ser una solución, la solución óptima se puede dividir enmmGrupo m , puede no sermmgrupo m , para nommLa solución óptima del grupo m en realidad se puede transformar en mmEn el caso del grupo m , es suficiente dividir el grupo en múltiples grupos.

el código

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 5010;

int n, m;
int w[N];
int f[N][N];

int main()
{
    
    
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
    sort(w + 1, w + n + 1);

    for (int i = 1, k = 1; i <= n; i ++ )
    {
    
    
        while (w[i] - w[k] > 5) k ++ ;
        for (int j = 1; j <= m; j ++ )
            f[i][j] = max(f[i - 1][j], f[k - 1][j - 1] + (i - k + 1));
    }

    printf("%d\n", f[n][m]);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/xxmy7/article/details/117392551
Recomendado
Clasificación