Sequência simulada de swing (DP) da 11ª Competição Provincial da Copa Lanqiao

Se os itens ímpares de uma sequência forem todos maiores do que o item anterior e os itens pares forem todos menores do que o item anterior, isso é chamado de sequência de oscilação. Ou seja, a [2i] <a [2i-1], a [2i + 1]> a [2i].
  Xiao Ming quer saber quantas sequências de swing com comprimento me cada número sendo um inteiro positivo entre 1 e n.

Formato de entrada

A linha de entrada contém dois inteiros me n.

Formato de saída

Produza um inteiro para indicar a resposta. A resposta pode ser muito grande, imprima o restante da resposta dividido por 10.000.

Entrada de amostra

3 4

Saída de amostra

14

Descrição da amostra

A seguir está a sequência de swing que atende aos 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 e convenções de casos de uso de avaliação

Para 20% dos casos de avaliação, 1 <= n, m <= 5;
  para 50% dos casos de avaliação, 1 <= n, m <= 10;
  para 80% dos casos de avaliação, 1 <= n, m <= 100 ;
  Para todos os casos de avaliação, 1 <= n, m <= 1000.

Significado da pergunta : encontre o número de sequências de balanço de comprimento m no intervalo de 1 a n

Idéia : De acordo com o volume de dados do sujeito, a busca por força bruta definitivamente não vai passar. Esse tipo de balanço está naturalmente associado ao DP, mas o problema é como expressar essa mudança. Aqui podemos usar dp [i] [j] para expressar:

Número ímpar: quando o i-ésimo dígito é o menor número j, quantos:

Número par: quando o i-ésimo dígito é o número máximo de j:

Quando i é um número par: dp [i] [j] = dp [i-1] [j + 1] + dp [i] [j-1]; (aqui podemos entender que ele representará o i-ésimo dígito, Quando o número máximo é j, ele é dividido em duas partes - quando o número máximo do i-ésimo dígito é j-1 e, quando o número mínimo do i-1 ° dígito é j + 1 (ou seja, quando o i-ésimo dígito é j))

Quando i é um número ímpar: dp [i] [j] = (dp [i-1] [j-1] + dp [i] [j + 1]); (aqui podemos entendê-lo como representando o i-ésimo dígito Quando o número mínimo é j, ele é dividido em duas partes - quando o número mínimo da i-ésima casa é j + 1 e quando o número máximo da i-1ª casa é j-1 [isto é, quando a i-ésima casa é j]

Finalmente, se nosso comprimento total é ímpar, então é dp [m] [1], se for par, é 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;
}

Acho que você gosta

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