Rezolvare completă PbInfo #691 Drumuri1

O tablă pătratică este formată din N x N celule pătrate, identice ca dimensiune, grupate pe N linii şi N coloane numerotate de la 1 la N. Din oricare celulă aflată la linia i şi coloana j, se poate face o deplasare doar spre celula vecină (i + 1, j) sau (i, j + 1), dacă aceasta există. În interiorul a M celule ale acestei matrice s-a așezat câte un jeton.

Numim drum pe această tablă, orice succesiune de celule parcurse conform regulii de deplasare descrisă anterior. Lungimea unui asemenea drum este egală cu numărul de celule parcurse.

Cerința

Cunoscând dimensiunea tablei N, numărul total de jetoane m şi două numere naturale L şi K, să se determine un număr d, reprezentând numărul de drumuri distincte modulo 31607 de lungime L care pornesc din celula (1, 1) şi care conţin fiecare câte K jetoane.

Date de intrare

Fişierul de intrare drumuri1.in conţine pe prima linie patru numere naturale N m K L separate prin câte un spaţiu, cu semnificația descrisă anterior.

Pe fiecare dintre următoarele m linii, se găsesc câte două numere naturale x y separate printr-un spaţiu, reprezentând linia şi coloana pe care se găseşte un jeton.

Date de ieșire

Pe prima linie a fişierului drumuri.out se va scrie un singur număr natural D reprezentând numărul de drumuri modulo 31607 care pornesc din celula (1, 1), au lungimea L şi trec prin K celule care conțin jetoane.

Restricții și precizări

  • 1 ≤ K ≤ N ≤ 250
  • 1 ≤ m ≤ 10 000
  • 1 ≤ L < 500
  • Două drumuri se consideră distincte dacă diferă prin cel puţin o celulă.
  • Într-o celulă se găsește cel mult un jeton.

Exemplu

drumuri1.in

3 4 3 4
1 1
1 3
2 2 
2 3

drumuri1.out

3

Explicație

Sunt 3 drumuri de lungime 4 care conțin 3 jetoane:
(1, 1), (1, 2), (1, 3), (2, 3)
(1, 1), (1, 2), (2, 2), (2, 3)
(1, 1), (2, 1), (2, 2), (2, 3)


Exemplu

drumuri1.in

4 5 2 4
1 2
2 1
1 3
3 2
4 3

drumuri1.out

5

Explicație

Sunt 5 drumuri de lungime 4 care conțin 2 jetoane:
(1, 1), (1, 2), (1, 3), (1, 4)
(1, 1), (1, 2), (1, 3), (2, 3)
(1, 1), (1, 2), (2, 2), (3, 2)
(1, 1), (2, 1), (2, 2), (3, 2)
(1, 1), (2, 1), (3, 1), (3, 2)

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Drumuri1:

/*  100 puncte
    Complexitate: O(N^2 *K)
    Constantin Galatan
*/
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("drumuri1.in");
ofstream fout("drumuri1.out");
const int Dim = 251;
const int MOD = 31607;
int L;
int m, n, K;

int nr[Dim][Dim][Dim]; // nr[i][j][k] - nr drumuri pana la poz (i, j) care trece prin k valori 1
short a[Dim][Dim], sl[Dim];

int main()
{
    fin >> n >> m >> K >> L;
    int x, y;
    for ( int i = 0; i < m; ++i )
    {
        fin >> x >> y;
        a[x][y] = 1;
    }

    nr[0][1][0] = 1;
    int res = 0, pmax = min(L, K), imax = min(n, L);

    for ( int i = 1; i <= imax; ++i )
        for ( int j = 1; j <= n && i + j - 1 <= L; ++j )
            for ( int p = 0; p <= pmax && p <= i + j - 1; ++p )
                nr[i][j][p + a[i][j]] = (nr[i - 1][j][p] + nr[i][j - 1][p]) % MOD;

    for ( int i = 1; i <= imax; ++i )
    {
        res += nr[i][L - i + 1][K];
        if ( res > MOD )
            res -= MOD;
    }

    fout << res << '\n';
    fin.close();
    fout.close();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #691 Drumuri1

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #691 Drumuri1 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!