Tak jak w tytule, mam problem z programowaniem dynamicznym.
Zadania, gdzie trzeba pogooglować, idą mi zazwyczaj dobrze (zarówno takie, że tak to ujmę, proste (!= łatwe), gdzie wystarczy znaleźć jedną rzecz, jak też złożone, w których trzeba zrobić dłuższy research, a niekiedy nawet zastosować rzeczy, które wcześniej robiło się jako pojedyncze zadania).
Niestety w momencie, gdy trzeba cokolwiek wymyślić samemu, leżę. I to totalnie. Nie idą mi zarówno jak mniemam prostsze zadania (takie jak “Igiełka”), jak też te trudniejsze (np. “Tanie hotele” - nie mam pojęcia, kto i w jakim celu je wstawił do łatwych - chyba tylko po to, żeby dołować nowych programistów
). Klasyczny problem sumy podciągu był dla mnie czarną magią, dopóki nie przerobiłem znalezionego w internecie kodu (tzn. przepisywałem i starałem się zrozumieć, czemu działa). Dzisiaj próbowałem zrobić zadanie “Ciąg arytmetyczny II” - rano przyszedł mi do głowy pomysł (jak zresztą dosyć często). Niestety moje rozwiązanie było błędne. Poprawiłem błędy, to przekraczało limit czasu. Wtedy zdałem sobie sprawę, że właściwie robię zwykły brute force i to nie ma prawa przejść. Zero pomysłów, jak to inaczej zrobić. A miało być tak dobrze…
Często mam też problem ze zrozumieniem różnych algorytmów, np. KMP (i nadal nie do końca wiem czy rozumiem, bo nie miałem za bardzo okazji robić zadania, gdzie byłby wymagany). Chciałem zrozumieć drzewa przedziałowe, to nigdzie nie mogłem znaleźć jakiegoś fajnego kursu/tutoriala z przykładami, wszędzie tylko albo sam kod albo niezrozumiały (przynajmniej dla mnie) opis. Wszędzie zaczyna się od reprezentacji drzewa w postaci tablicy, podczas gdy ja do niedawna nie rozumiałem, jak reprezentować i wykonywać operacje na najzwyklejszych binarnych drzewach poszukiwań. Moja próba zrozumienia grafów zakończyła się na próbie zakodowania algorytmu Dijkstry bez korzystania ze wskazówek, potem dałem sobie spokój.
Książki algorytmiczne (głównie w postaci PDF) niby mogłyby być rozwiązaniem, ale obydwie, przez które próbowałem przebrnąć, mają swoje wady. “Algorytmika praktyczna” - niezrozumiały kod, używający makr i jednoliterowych nazw zmiennych, często bez wyjaśnienia, jak dany algorytm działa. Ale spoko, jestem w stanie zrozumieć “praktyczna” w tytule, nawet sam autor w rozdziale dotyczącym BigNumów kładzie nacisk na to, żeby brać, co w danej chwili jest potrzebne. Może też jestem jeszcze za mało zaawansowany, żeby zrozumieć niektóre rzeczy. Niestety, kolejna książka, a mianowicie “Wprowadzenie do algorytmów” (zwracam uwagę na “wprowadzenie” w tytule) też mnie zawiodła. Szczerze przyznam, że przerwałem czytanie w momencie, w którym po zaprezentowaniu sortowania przez scalanie autor dał zadanie polegające na wyznaczeniu liczby inwersji w tablicy w czasie O(n log n) (jako wskazówka jest podane, żeby użyć właśnie sortowania przez scalanie). Nie wiem, czy to ja jestem jakiś niemyślący, ale gdyby nie to, że wiedziałem już o tym przed rozpoczęciem czytania, nigdy bym nie wpadł na to, że w ogóle można za pomocą merge sort takie coś zrealizować, a co dopiero zaimplementować (nawiasem pisząc nadal nie rozumiem, dlaczego ten algorytm działa).
Zastanawiam się, czy może trafiłem już w granicę, która dzieli “prawdziwych programistów” od klepaczy kodu. Ciężko mi idzie kreatywne myślenie, a zauważyłem, że w robieniu nieco bardziej złożonych zadań, gdzie nie widać rozwiązania na pierwszy rzut oka, jest wręcz niezbędne.
Dziękuję tym, którzy przebrnęli przez tę ścianę tekstu. Bardzo mi byłoby miło gdybyście się wypowiedzieli, jak to u was wyglądało, czy może też mieliście takie doświadczenia. Przeglądałem forum, ale nie znalazłem żadnej informacji w tym stylu (poza tematem Czy Spoj [forum] pomaga w pisaniu "dobrych" podpowiedzi?, a w szczególności postem @tarpauwatratar). Podejrzewam, że takich tematów było na starym forum sporo, no ale niestety dla niektórych (adminów) lepiej zepsuć coś, co działało…