Zadanie 3. Najdłuższy niemalejący podciąg

Problem najdłuższego niemalejącego podciągu jest klasycznym problemem optymalizacyjnym. Oznacza to, że posiada on własność optymalnej podstrukturywłasność optymalnej podstrukturywłasność optymalnej podstruktury. Problem ten jest następujący: mamy ciąg n liczb całkowitych aIndeks dolny 1 Indeks dolny koniec,aIndeks dolny 2 Indeks dolny koniec,...,aIndeks dolny n Indeks dolny koniec , należy znaleźć najdłuższy podciąg bIndeks dolny 1 Indeks dolny koniec,bIndeks dolny 2 Indeks dolny koniec,...,bIndeks dolny k Indeks dolny koniec ciągu aIndeks dolny i Indeks dolny koniec, że dla każdego i>0 prawdą jest bIndeks dolny i Indeks dolny koniec bIndeks dolny i+1 Indeks dolny koniec.

Przykładowo: dla ciągu [4, 6, 3, 9, 1, 0, 1, 4, 7, 2, 5, 8, 9, 3, 5] maksymalny niemalejący podciąg to [1, 1, 4, 7, 8, 9].

W pliku liczby.txt znajduje się 1000 liczb całkowitych dodatnich, zapisanych dziesiętnie, maksymalnie sześciocyfrowych. Każda liczba umieszczona jest w osobnym wierszu.

Przykładowe dane:

  • 65173

  • 818677

  • 18065

R19BDTPCLGAJS

Plik TXT o rozmiarze 7.71 KB w języku polskim

a) Napisz program, który zwróci długość maksymalnego niemalejącego podciągu. Wykorzystaj programowanie dynamiczne.

Specyfikacja problemu:

Dane:

  • n – długość wejściowego ciągu liczb; liczba naturalna

  • liczby[] – tablica liczb naturalnych, wśród których należy znaleźć najdłuższy niemalejący podciąg

Wynik:

  • maks_dlugosc – długość najdłuższego niemalejącego podciągu; liczba naturalna

b) Napisz program, który wypisze liczby należące do najdłuższego niemalejącego podciągu, oddzielone od siebie spacją. Jeśli najdłuższych ciągów jest wiele, to zwróć taki, który kończy się na wyrazie liczby[i], gdzie i jest najmniejsze.

Specyfikacja problemu:

Dane:

  • n – długość wejściowego ciągu liczb

  • liczby[] – tablica liczb naturalnych, wśród których należy znaleźć najdłuższy niemalejący podciąg

Wynik:

  • najdluzszy_niemalejacy_podciag[] – tablica zawierająca najdłuższy niemalejący podciąg; tablica liczb naturalnych

Rozwiązania obu poleceń zapisz w pliku wyniki.txt, każde w osobnej linii.

Rozwiązanie

Zdefiniujmy tablicę d[] rozmiaru n. Wartość d[i] tej tablicy oznacza długość maksymalnego podciągu niemalejącego dla ciągu liczby[0,...,i] który kończy się na liczby[i]. Wyliczamy wartości w tablicy d[], zaczynając od i = 0 aż do i = n - 1. Maksymalna wartość w uzupełnionej tablicy d[] jest równa długości maksymalnego ciągu niemalejącego.

Jeśli d[0] = 1, to każdą wartość d[i] dla 1 <= i < n można wyznaczyć z równania rekurencyjnego.

d[i] = max(d[j], gdzie j=0,..,i‑1 i liczby[i] >= liczby[j]) + 1

a) Rozwiązanie przedstawionego problemu zapisanego w pseudokodzie jest następujące:

Linia 1. funkcja najdluzszyNiemalejacyPodciag otwórz nawias okrągły liczby otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek n zamknij nawias okrągły dwukropek. Linia 2. d otwórz nawias kwadratowy n zamknij nawias kwadratowy ← tablica długości n przecinek wypełniona 1. Linia 3. maks podkreślnik dlugosc ← 0. Linia 5. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 6. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek i minus 1 wykonuj dwukropek. Linia 7. jeżeli liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości liczby otwórz nawias kwadratowy j zamknij nawias kwadratowy ORAZ d otwórz nawias kwadratowy j zamknij nawias kwadratowy plus 1 zamknij nawias ostrokątny d otwórz nawias kwadratowy i zamknij nawias kwadratowy dwukropek. Linia 8. d otwórz nawias kwadratowy i zamknij nawias kwadratowy ← d otwórz nawias kwadratowy j zamknij nawias kwadratowy plus 1. Linia 10. jeżeli d otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maks podkreślnik dlugosc dwukropek. Linia 11. maks podkreślnik dlugosc ← d otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 13. zwróć maks podkreślnik dlugosc.

b) Aby przechowywać obecnie znaleziony najdłuższy podciag niemalejacy, a na końcu go zwrócić potrzebujemy dodatkowo 2 tablic oraz 1 pomocniczej zmiennej.

Tablica poprzedni_element_podciagu[] ma rozmiar n i początkowo wypełniona jest -1. Jeżeli w tablicy d[] pod indeksem i zapiszemy nowe znalezione rozwiązanie (znajdziemy dłuższy podciąg), które bierze rozwiązanie w d[j] i rozszerza je o element liczby[i], to w tablicy poprzedni_element_podciagu[] na pozycji i zapiszemy j jako poprzedni element znalezionego podciągu.

Zmienna ostatni_element_ciągu będzie pamiętać indeks, pod którym znajduje się ostatni element znalezionego najdłuższego niemalejącego podciągu. Dzięki niej będziemy mogli odtworzyć ten ciąg przy użyciu tablicy poprzedni_element_podciagu[].

Tablica najdluzszy_niemalejacy_podciag[] długości maks_dlugosc posłuży nam do zapisania wynikowego podciągu w przystępnej formie i zwrócenia go.

Zapisany za pomocą pseudokodu algorytm wyznaczający maksymalny podciąg niemalejący wygląda następująco:

Linia 1. funkcja najdluzszyNiemalejacyPodciag otwórz nawias okrągły liczby otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek n zamknij nawias okrągły dwukropek. Linia 2. d otwórz nawias kwadratowy n zamknij nawias kwadratowy ← tablica długości n przecinek wypełniona 1. Linia 3. poprzedni podkreślnik element podkreślnik podciagu ← tablica długości n przecinek wypełniona minus 1. Linia 4. ostatni podkreślnik element podkreślnik podciagu ← minus 1. Linia 5. maks podkreślnik dlugosc ← 0. Linia 7. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek. Linia 8. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek i minus 1 wykonuj dwukropek. Linia 9. jeżeli liczby otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości liczby otwórz nawias kwadratowy j zamknij nawias kwadratowy ORAZ d otwórz nawias kwadratowy j zamknij nawias kwadratowy plus 1 zamknij nawias ostrokątny d otwórz nawias kwadratowy i zamknij nawias kwadratowy dwukropek. Linia 10. d otwórz nawias kwadratowy i zamknij nawias kwadratowy ← d otwórz nawias kwadratowy j zamknij nawias kwadratowy plus 1. Linia 11. poprzedni podkreślnik element podkreślnik podciagu otwórz nawias kwadratowy i zamknij nawias kwadratowy ← j. Linia 14. jeżeli d otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maks podkreślnik dlugosc dwukropek. Linia 15. maks podkreślnik dlugosc ← d otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 16. ostatni podkreślnik element podkreślnik podciagu ← i. Linia 18. najdluzszy podkreślnik niemalejacy podkreślnik podciag ← tablica długości maks podkreślnik dlugosc przecinek wypełniona minus 1 przecinek która będzie zawierała znaleziony podciąg. Linia 20. dla i znak równości maks podkreślnik dlugosc minus 1 przecinek maks podkreślnik dlugosc minus 2 przecinek kropka kropka kropka przecinek 0 wykonuj dwukropek. Linia 21. najdluzszy podkreślnik niemalejacy podkreślnik podciag otwórz nawias kwadratowy i zamknij nawias kwadratowy ← liczby otwórz nawias kwadratowy ostatni podkreślnik element podkreślnik podciagu zamknij nawias kwadratowy. Linia 22. ostatni podkreślnik element podkreślnik podciagu ← poprzedni podkreślnik element podkreślnik podciagu otwórz nawias kwadratowy ostatni podkreślnik element podkreślnik podciagu zamknij nawias kwadratowy. Linia 24. zwróć najdluzszy podkreślnik niemalejacy podkreślnik podciag.

Zadanie zostało opracowane na podstawie zadania 62.2. ze zbiorów zadań maturalnych CKE.

Schemat oceniania

  • 2 pkt – za poprawną odpowiedź do obu podpunktów zadania

  • 1 pkt – za poprawną odpowiedź do jednego z podpunktów zadania

  • 0 pkt – za niepoprawną odpowiedź do obu podpunktów lub brak odpowiedzi

Odpowiedź do zadania

Prawidłowe wyniki dla danych z pliku znajdują się w załączniku:

R179HT244C8FF

Plik TXT o rozmiarze 344.00 B w języku polskim

Słownik

własność optymalnej podstruktury
własność optymalnej podstruktury

problem posiada własność optymalnej podstruktury, jeśli optymalne rozwiązanie głównego problemu można znaleźć z optymalnych rozwiązań jej podproblemów