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;
}