Angefangen von der Anzahl der Spalten talabwärts P2401

Thema Link .

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

Ich denke du magst

Origin www.cnblogs.com/dmoransky/p/12482188.html
Empfohlen
Rangfolge