Lösung
State-Design
Set \ (f_ {i, j} \) von \ (1 \) zu \ (I \) ist, angeordnet , die \ (J \) a \ (\ text { '<' } \) der Anzahl von Programmen.
Zustandsübergang
Versuchen , von (I \) \ schreitet zu \ (i + 1 \) wird die Substanz als \ (i + 1 \) ist , auf die Position der Sequenz eingefügt.
- Wenn Sie auf der linken Seite einfügen, wird ein Größer-als - Zeichen (add \ (1 \) Fall)
- Wenn der Einsatz auf der rechten Seite die meisten, fügt weniger als eine Zahl ( \ (1 \) Fall)
- Wenn Sie eingefügt zwischen einem weniger-als, weniger als zerstören a eine Zahl kleiner als und größer als, größer als das Äquivalent einer neuen Nummer zu generieren ( \ (J \) Fall)
- Wenn die Anzahl größer als eins ist zwischen dem Einsatz ist, zerstören eine Zahl größer als, erzeugen eine Größer-als - und kleiner als eine Zahl, weniger als das Äquivalent von einer neuen Nummer ( \ (I -. 1 - J \) case)
Um es zusammenzufassen:
- Es \ (j + 1 \) Fall ist , größer als die Zunahme in einer Reihe, d.h. \ (f [i + 1] [j] \ bekommt f [i] [j] * (j + 1) \)
- Es \ (i - j \) Fall eine Anzahl geringer als die Erhöhung \ (f [i + 1] [j + 1] \ bekommt f [i] [j] * (i - j) \)
Code
#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]);
}