Secuencia de swing simulada (DP) de la XI Competición Provincial de la Copa Lanqiao

Si los elementos impares de una secuencia son todos más grandes que el elemento anterior y los elementos pares son todos más pequeños que el elemento anterior, se denomina secuencia de oscilación. Es decir, a [2i] <a [2i-1], a [2i + 1]> a [2i].
  Xiao Ming quiere saber cuántas secuencias de swing con longitud my cada número es un entero positivo entre 1 y n.

Formato de entrada

La línea de entrada contiene dos números enteros my n.

Formato de salida

Genere un número entero para indicar la respuesta. La respuesta puede ser muy grande, por favor genere el resto de la respuesta dividido por 10000.

Entrada de muestra

3 4

Salida de muestra

14

Descripción de la muestra

La siguiente es la secuencia de swing que cumple con los requisitos:
  2 1 2
  2 1 3
  2 1 4
  3 1 2
  3 1 3
  3 1 4
  3 2 3
  3 2 4
  4 1 2
  4 1 3
  4 1 4
  4 2 3
  4 2 4
  4 3 4

Escala de casos de uso de evaluación y convenciones

Para el 20% de los casos de evaluación, 1 <= n, m <= 5;
  para el 50% de los casos de evaluación, 1 <= n, m <= 10;
  para el 80% de los casos de evaluación, 1 <= n, m <= 100 ;
  Para todos los casos de evaluación, 1 <= n, m <= 1000.

Significado de la pregunta : encuentre el número de secuencias de swing de longitud m en el rango de 1 an

Idea : a juzgar por la cantidad de datos del tema, la búsqueda de fuerza bruta definitivamente no pasará. Este tipo de swing está naturalmente asociado con DP, pero el problema es cómo expresar este cambio. Aquí podemos usar dp [i] [j] para expresar:

Número impar: cuando el i-ésimo dígito es el número j más pequeño, cuántos:

Número par: cuando el i-ésimo dígito es el número máximo de j:

Cuando i es un número par: dp [i] [j] = dp [i-1] [j + 1] + dp [i] [j-1]; (Aquí podemos entender que representará el i-ésimo dígito, Cuando el número máximo es j, se divide en dos partes: cuando el número máximo del i-ésimo dígito es j-1 y, cuando el número mínimo del i-1 ° dígito es j + 1 (es decir, cuando el i-ésimo dígito es j))

Cuando i es un número impar: dp [i] [j] = (dp [i-1] [j-1] + dp [i] [j + 1]); (aquí podemos entenderlo como la representación del i-ésimo dígito Cuando el número mínimo es j, se divide en dos partes: cuando el número mínimo del i-ésimo dígito es j + 1, y cuando el número máximo del i-1º dígito es j-1 [es decir, cuando el i-ésimo dígito es j]

Finalmente, si nuestra longitud total es impar, entonces es dp [m] [1], si es par, es dp [m] [n].

Código:

#include <iostream>
using namespace std;
int dp[1010][1010];
int main() {
    
    
    // m为长度,n为数的范围
    int m,n;
    cin>>m>>n;
    for(int i = 1; i <= n; i++)
        dp[1][i] = n - i + 1;
    for(int i = 2; i <= m; i++)
        if(i & 1)
            for(int j = n; j >= 1; j--)
                dp[i][j] = (dp[i-1][j-1] + dp[i][j+1]) % 10000;
        else
            for(int j = 1; j <= n; j++)
                dp[i][j] = (dp[i-1][j+1] + dp[i][j-1]) % 10000;
    int ans = m & 1 ? dp[m][1] : dp[m][n];
    cout<<ans;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43244265/article/details/105615084
Recomendado
Clasificación