Szczegółowe omówienie zadania Depesza, które powstało na podstawie problemu z rozmowy kwalifikacyjnej do Facebook-a:
–
Link do zadania:
https://szkopul.edu.pl/problemset/problem/depesza/site
Link do zadania:
https://szkopul.edu.pl/problemset/problem/depesza/site
–
Zadanie wykorzystuje programowanie dynamiczne, a także efektywną i prostą metodę algorytmiki:
https://youtu.be/ufvS-VfPDLs?t=326
https://youtu.be/ufvS-VfPDLs?t=326
——-
Poniżej kod wzorcowy do zadania użyty w omówieniu:
–
#include <bits/stdc++.h>
using namespace std;
const int MAX_DLUGOSC = 2e6+7;
const int MODULO_WAR = 1e9+7;
string wiadomosc;
int ile_mozliwosci[MAX_DLUGOSC];
bool Czy_2_OstatnieTworzaLitere(int i) {
if (wiadomosc[i-1] == '1')
return true;
if ( (wiadomosc[i-1] == '2') && (wiadomosc[i] <= '6') ) return true; return false; } bool Czy_1_OstatniaTworzyLitere(int i) { if (wiadomosc[i] == '0') return false; return true; } int main() { int akt_wynik; int i; cin >> wiadomosc;
wiadomosc = " " + wiadomosc;
ile_mozliwosci[0] = 0;
ile_mozliwosci[1] = 1;
for (i=2; i<wiadomosc.length(); ++i) {
akt_wynik = 0;
if ( Czy_2_OstatnieTworzaLitere(i) == true ) {
akt_wynik = ile_mozliwosci[i-2];
}
if ( Czy_1_OstatniaTworzyLitere(i) == true ) {
akt_wynik += ile_mozliwosci[i-1];
akt_wynik %= MODULO_WAR;
}
if (akt_wynik == 0) {
cout << "0\n";
return 0;
}
ile_mozliwosci[i] = akt_wynik;
}
cout << ile_mozliwosci[ wiadomosc.length()-1 ] << "\n";
return 0;
}
