Solución
diseño de estado
Set \ (f_ {i, j} \) de \ (1 \) a \ (I \) están dispuestos, que \ (J \) un \ (\ text { '<' } \) de la serie de programas.
transición de estado
Trate de (I \) \ procede a \ (i + 1 \) , la sustancia se considera que \ (i + 1 \) se inserta a la que la posición de la secuencia.
- Si inserta a la izquierda, se añadirá un signo mayor que ( \ (1 \) caso)
- Si la inserción a la derecha más, se sumará a menos de un número ( \ (1 \) caso)
- Si ha insertado entre un menos-que, menos que destruir un generan un número menor que y mayor que, mayor que el equivalente de un nuevo número ( \ (J \) caso)
- Si el número es mayor que uno entre el inserto, destruir un mayor número que, producir un mayor que y menor que un número, a menos que el equivalente de un nuevo número ( \ (I -. 1 - J \) caso)
Para resumir:
- Hay \ (j + 1 \) caso es mayor que el aumento de un número, es decir, \ (f [i + 1] [j] \ obtiene f [i] [j] * (j + 1) \)
- Hay \ (i - j \) caso el aumento de un número menor que \ (f [i + 1] [j + 1] \ obtiene f [i] [j] * (i - j) \)
Código
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1005, P = 2015;
int n, K, f[N][N];
int main() {
scanf("%d%d", &n, &K);
f[1][0] = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
(f[i + 1][j] += f[i][j] * (j + 1)) %= P;
(f[i + 1][j + 1] += f[i][j] * (i - j)) %= P;
}
}
printf("%d\n", f[n][K]);
}