Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Zadanie I* - Diamenty
Idź do strony 1, 2  Następny
 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
r4ku
żul



Dołączył: 09 Lut 2006
Posty: 722
Przeczytał: 0 tematów

Skąd: klikash? :D

PostWysłany: Czw 9:01, 26 Paź 2006    Temat postu: Zadanie I* - Diamenty

[link widoczny dla zalogowanych]
czy ktos jeszcze odnosi wrazenie ze jakos duzo tych zadan na 1 IX? :?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kafex
zielony żul



Dołączył: 28 Mar 2006
Posty: 1458
Przeczytał: 0 tematów

Skąd: Zawiercie

PostWysłany: Czw 17:02, 26 Paź 2006    Temat postu:

JA :]
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Pią 18:50, 27 Paź 2006    Temat postu:

Zadanie jest ossstre, ale łatwe jak się wpadnie na pomysł :D
Zdecydowanie najciekawsze z tych co były do tej pory.

Jakby ktoś chciał to wrzuciłem binarkę
[link widoczny dla zalogowanych]
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Makros
pijak



Dołączył: 01 Gru 2005
Posty: 420
Przeczytał: 0 tematów

Skąd: Kraków

PostWysłany: Sob 10:56, 28 Paź 2006    Temat postu:

to zdradź nam jeszcze czy te kosmiczne ilości pamięci też są potrzebne...? :)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Sob 11:06, 28 Paź 2006    Temat postu:

Zdecydowanie nie potrzeba więcej pamięci niż do pozostałych zadań... Nie wiem po co jest tak duży limit, chyba tylko po to, żeby zmylić studentów :D
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
przem
[świeżak]



Dołączył: 13 Paź 2006
Posty: 14
Przeczytał: 0 tematów

Skąd: Krosno

PostWysłany: Sob 13:44, 28 Paź 2006    Temat postu:

dobra panowie i panie burza mozgow...
wypisujcie swoje pomysly zastanowimy sie wspolnie trzeba jakos rozkminic to zadanie.
moj pomysl:
z lewego gornego do prawego dolnego rozpatrujemy wszystkie mozliwe drogi, liczymy diamenty i usuwamy je z planszy
droga z powrotem to prosty dynamik (liczymy ile maksymalnie mozemy wziac z pozostalych diamentow), liczymy diamenty
sumujemy diamenty, wstawiamy do jakiejs tablicy i wszystko od nowa (oczywiscie diamenty ktore wzielismy poprzednio musza sie jakos znalezc z powrotem na planszy)
pozniej bierzemy maks po tej naszej tablicy
co wy na to? dlaczego zle dlaczego moze byc dobrze, czekam na jakies uwagi, sugestie itp itd
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Sob 13:52, 28 Paź 2006    Temat postu:

Nie przejdzie bo ścieżek z góry do dołu jest zdecydowanie za dużo. Nie wiem dokładnie ile, ale coś mi mówi, że będzie to liczba w granicach n!
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Sob 17:45, 28 Paź 2006    Temat postu:

@Rogal:
Mnie więcej. Ilość ścieżek jest bezpośrenio powiązana z symbolem Newtona. Dla maksymalnych danych mój kalkulator liczył kilkanaście sekund, po czym wywalił overflowa :P .
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mateo
pijak



Dołączył: 08 Mar 2006
Posty: 296
Przeczytał: 0 tematów

Skąd: Krk - Biały Prądnik

PostWysłany: Nie 1:18, 29 Paź 2006    Temat postu:

Rogal napisał:
Zdecydowanie nie potrzeba więcej pamięci niż do pozostałych zadań... Nie wiem po co jest tak duży limit, chyba tylko po to, żeby zmylić studentów :D


no chyba jedynie po to.. Ja tylko dodam, ze w zupelnosci wystarczy O(n^2) pamieci czyli jakies 500kB. A zadanko rzeczywiscie calkiem fajne. Jak sie je juz zrobi to sie wydaje mega proste. Sposrod dotychczaswych zadan to tylko B i G zajelo mi mniej kodu, takze naprawde w skodowaniu jest to bardzo proste, ale trzeba najpierw je rozkminic :)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Nie 10:32, 29 Paź 2006    Temat postu:

No mi ono zajęło prawie 60 linii więc zaliczam je do raczej długich. Ale to pewnie dlatego, że robiłem je na 2 pętlach, a możnaby na 1, tylko trzebaby mocniej pomyśleć nad zapisem :D
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
luu
[świeżak]



Dołączył: 28 Paź 2006
Posty: 10
Przeczytał: 0 tematów


PostWysłany: Nie 15:21, 29 Paź 2006    Temat postu:

Niech ktoś walnie jakąś małą ale dość oczywistą podpowiedź.Nie róbcie ludzie z tego takiej tajemnicy.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Nie 15:32, 29 Paź 2006    Temat postu:

luu napisał:
Niech ktoś walnie jakąś małą ale dość oczywistą podpowiedź.

Zadanie można rozwiązać dynamicznie. Złożoność czasowa O(n^3), pamięciowa O(n^2).

edited:
Stan zapamiętywany w tablicy reprezentuje gdzie kończą się ścieżki (1 wymiar tablicy na 1 ścieżkę), a wartością stanu jest ile diamentów te dwie ścieżki mogły maksymalnie zebrać.
Po takiej podpowiedzi to już chyba każdy powinien to rozkminić...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
kg86
zielony żul



Dołączył: 22 Gru 2005
Posty: 1194
Przeczytał: 0 tematów

Skąd: pochodze?

PostWysłany: Nie 15:53, 29 Paź 2006    Temat postu:

no ja wlasnie w ten sposob probowalem sie do tego zabrac :P tylko jak w jednym wymiarze zapamietac jedna sciezke, ktora jest co jak co dwuwymiarowa? :>
btw. dzieki za binarke, na pewno sie przyda :)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
luu
[świeżak]



Dołączył: 28 Paź 2006
Posty: 10
Przeczytał: 0 tematów


PostWysłany: Nie 18:57, 29 Paź 2006    Temat postu:

Czy wypelniamy tablice kolumnami tj 1.1/ 1.2/ 1.3 ...1.n pozniej 2.1/2.2/ ....n.n ?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Nie 19:58, 29 Paź 2006    Temat postu:

To była tak ogromniasta podpowiedź, że teraz wszystko jest jasne ;) . Dzięki Rogal :) . Myślałem od 2 dni nad tym zadaniem i nawet idea tego rozwiązania mi przyszła do głowy, ale nie zaprzątała jej zbyt długo, niestety.

Co do kolumn, to ja na nich na pewno robić nie będę :P .
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Robson
zielony żul



Dołączył: 21 Paź 2005
Posty: 1274
Przeczytał: 0 tematów

Skąd: Z Lasu :]

PostWysłany: Pon 1:22, 30 Paź 2006    Temat postu:

Czy ktos jest mi w stanie powiedziec dlaczego nie przechodzi na kolumnach?... Bo jakos to ogladam od kazdej strony, od kazdego indeksu i wychodzi ze powinno dzialac :? a tu klops... jedno dziala drugie nie... (wiem ze po kolumnach jest gorzej, trudniej, ale dlaczego jest ANS...? )
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Pon 1:46, 30 Paź 2006    Temat postu:

O tej porze zdecydowanie nie mogę się skupić na indeksach moich tablic, przez co wszystko się krzaczy :? . Heh, odpowienio wszystko poindeksować to jednak jest sztuka ;] .
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
r4ku
żul



Dołączył: 09 Lut 2006
Posty: 722
Przeczytał: 0 tematów

Skąd: klikash? :D

PostWysłany: Pon 18:13, 30 Paź 2006    Temat postu:

ja jakis glupi jestem, kminie caly czas jak ja ten caly szajs mam trzymac zeby jeden index tablicy przechowywal mi informacje o koncu jednej drogi, skoro do opisu polozenia konca drogi potszebuje 2 wartosci:/ czy moglbym poprosic o jakies naprowadzenie?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Pon 18:20, 30 Paź 2006    Temat postu:

Rozważasz w jednym kroku wszystkie ścieżki tej samej długości :) . Czas działania mojego algorytmu to O((w+h)*min{w, h}^2) - być może to też będzie jakaś podpowiedź ;) .
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mateo
pijak



Dołączył: 08 Mar 2006
Posty: 296
Przeczytał: 0 tematów

Skąd: Krk - Biały Prądnik

PostWysłany: Wto 3:39, 31 Paź 2006    Temat postu:

No dobra. Sporo osob jeszcze nei zrobilo tego zadanka a termin juz sie zbliza wiec postanowilem napisac maly tutorial....:)

Po pierwsze jak pewnie wiecie to to zadanko trzeba rozwiazac dynamicznie i ja osobiscie nie widze mozliwosci rozwiazania tego zadania innym sposobem (w rozsadnej zlozonosci). Wszelkie proby zachlanne czy jakies bfsy albo takie rzeczy daja bledne wyniki.
A jesli chodzi o dynamiczne podejscie do zadania to mozna tutaj rozwazyc dwie mozliwosci. 1 Szukamy dynamicznie najpierw jedenj sciezki a potem drugiej (no ale to jak wiadomo jest bledne, polaczenie tego z jakimis algorytmami zachlannymi itp albo dodatkowymi heurystykami tez raczej niczego nie da) 2. Szukamy obydwu sciezek rownoczesnie.

A wiec trzeba teraz sie zastanowic w jaki sposob mozna szukac naszych optymalnych sciezek rownoczesnie. Po pierwsze mozna zauwazyc ze nei ma roznicy z ktorego rogu do ktorego ida nasz sciezki (tzn nie ma roznicy miedzy rogiem lewym gornym i prawym dolnym). Mozemy zatem zalozyc ze zarowno pierwsza jak i druga sciezka ida z rogu gornego lewego do prawego dolnego.
Ja znam 2 sposoby na rozwiazanie tego. Pierwszy sposob jest chyba znacznie latwiejszy do zrozumienia. Drugi teoretcznie dziala tak samo, ale w innej kolejnosci jest obliczana macierz i troche bardziej zamotane sie mi to wydaje. (no ale akurat ja wymyslilem ten drugi sposob:))


1. Dynamika po dlugosciach sciezek.
Musimy znalezc 2 sciezki o dlugosci w + h - 2 kazda takie ze suma diamentow na tych dwoch sciezkach jest mozliwie najwieksza.
Robimy dynamike po dlugosciach sciezek od 1 do w - h - 2 i w 'k'-tym kroku rozpatrujemy wszystkie mozliwe pary sciezek dlugosci 'k' kazda (a raczej nie tyle wszystkie pary sciezek co pary koncowych elementow tych sciezek). Kazda sciezka dlugosci 'k' konczy sie w pewnym punkcie o wspolrzednych (x, k - x + 2). Czyli latwo zauwazyc ze pierwsza wspolrzedna ostatniego elementu pierwszej sciezki determinuje druga wspolrzedna i podobnie dla drugiej sciezki. Wiec w kazdym kroku naszego algorytmu dynamicznego musimy zrobic podwojna petle po wszystkich mozliwych x1 dla pierwszej sciezki i po wszystkich mozliwych x2 dla drugiej sciezki.

Przykladowo: jestesmy w 7-dmym kroku naszego algorytmu (rozpatrujemy sciezki dlugosci 7) mamy teraz do rozpatrzenia wszystkie pary sciezek, ktorych dlugosc jest rowna 7. Jedna z takich par jest zaznaczona na rysunku ponizej:


Niebieskie kropki oznaczaja koncowe elementy tych sciezek. Dokladna trasa tych sciezek nas zupelnie nie interesuje, gdyz nie ma znacznie ktoredy one przebiegaja. Mamy obliczyc jedynie maxymalna ilosc diamentow jaka mozemy zebrac gdy optymalne sciezki beda sie konczyly wlasnie w tych miejscach. No i teraz pytanie: -> skoro rozpatrywane sciezki koncza sie wlasnie w tych miejscach oznaczonych kropkami to gdzie moga sie znajdywac przedostatnie elementy tych sciezek? Sa 4 mozliwe przypadki. Do kazdego z koncowych elementow moglismy dojsc albo z gory albo z lewej strony (tak jak pokazuja czerwone strzalki). A poniewaz kazda mozliwa para elementow przedostatnich reprezentuje pewna pare sciezek dlugosci 'k'-1 to dla kazdej takiej pary mamy juz obliczona maxymalna ilosc diamentow jaka mozemy zebrac wybierajac optymalne sciezki konczace sie w tych wlasnie elementach. Wybieramy zatem maxymalna wartosc z tych 4 mozliwych wartosci dla kazdej pary elementow 'przedostatnich'. No i do tej wartosci musimy dodac ewentyalne diamenty ktore znajduja sie w aktualnie rozpatrywanych elementach 'ostatnich' (czyli w niebieskich kropkach). Trzeba oczywiscie uwazac zeby nie policzyc 2 razy diamentu gdy akurat rozpatrujemy przypadek gdy koncowe elementy znajduja sie w tym samym miejscu oraz w tym miejscu znajduje sie akurat diement. A teraz pytanie: skad mamy gwarancje, ze nie znajac przebiegu naszych sciezek mamy pewnosc ze napewno nie liczmy zadnego diamentu dwukrotnie na tych sciezkach (bo bo przeciez moze byc tak ze optymalne dwie sciezki, konczace sie w aktualnie rozpatrywanej parze koncowych miejsc, przecinaja sie w polu z diamentem)?. Ano wlasnie stad ze dowolna sciezka prowadzaca do pola (x, y) ma zawsze dlugosc x + y - 2. Zatem jesli optymalne dwie sciezki przecinaja sie w miejscu z diamentem, to fragmenty (do miejsca tego przeciecia) tych sciezek sa rownej dlugosci i sa optymalna para sciezek konczacych sie w tym wlasnie miejscu z diamentem (gdyby nie byly optymalne to wybralibysmy inna lepsza pare konczaca sie w tym miejscu z diamentem i tym samym przeczyloby to temu ze ilosc diamentow dla naszej wyjsciowej pary jest policzona optymalnie). Zostaly one policzone zgodnie z naszym algorytmem a zatem diament na koncowym polu zostal policzony raz (gdyz to jest ten przypadek o ktorym pisalem wyzej, ze wtedy trzeba ten diament liczyc raz) i to dowodzi tego ze zaden diament nie ma prawa zostac policzony wiecej niz raz w zadnej parze sciezek.


No wiec defakto tak wyglada cala idea algorytmu. Sama implementacja raczej trudna nie jest. mozna sobie ulatwic dodajac zerowe: wiersz i kolumne. Pozatym jesli chodzi o sam wyglad tablicy mozna zrobic 3-wymiarowa tablice gdzie pierwszy wymiar oznacza dlugosc sciezki,drugi oznacza wspolrzedna 'x' pierwszej sciezki, a trzeci wspolrzedna 'x' drugiej sciezki. Takie cos jednoznacznie okresla kazda pare sciezek (elementow 'koncowych'). No ale jak latwo sie przekonac nie potrzebujemy pierwszego wymiaru tej tablicy bo korzystamy zawsze jedynie z wartosci obliczonych dla sciezek o 1 krotszych. Szukany wynik znajdziemy w jedynym elemencie tablicy dla sciezki dlugosci w + h - 2;
takze tak wyglada pierwszy algorytm.

Jesli chodzi o zlozonosc czasowa to tak na pierwszy rzut oka jest to O((w+h)*min{w,h}^2)
Spectro napisał:
Rozważasz w jednym kroku wszystkie ścieżki tej samej długości :) . Czas działania mojego algorytmu to O((w+h)*min{w, h}^2) - być może to też będzie jakaś podpowiedź ;) .

podejrzewam Spectro ze wlasnie tak rozwiazujesz to zadanie, ale jesli chodzi o zlozonosc to sie mylisz:P
Mozna sobie bardzo latwo policzyc ile jest wszystich mozliwych par ktore bedzie musial obliczyc ten algorytm. Jest ich dokladnie:(bez straty ogolnosci mozna zalozyc ze w>=h)

[h*(h+1)*(3w-h+1)]/6 <= [(h^2)*w]/2

(btw: dla h=w wychodzi wzorek na sume kwadratow liczb od 1 do w :) )

biorac pod uwage ze za kazdym razem musimy sprawdzic 4 mozliwe sytuacje wczesniejsze to mozna zapisac zlozonosc tego algorytmu jako:
O(2*hw*min(h,w))





No a teraz drugi sposob mojego autorstwa:D

2. Dynamika po kolumnach.
Tym razem takzde bedziemy rozpatrywali pewne pary sciezek. lecz nie beda to pary sciezek o rownej dlugosci, ale pary sciezek ktorych ostatnie elementy koncza sie w danej kolumnie. (w 'k'tym kroku beda to pary sciezek konczacych sie w 'k'tej kolumnie). Tutaj jednak sytuacja jest troche bardziej skomplikowana w porownaniu z poprzednim algorytmem. W poprzednim algorytmie rozpatrywanie sciezek wedlug rosnacych dlugosci gwarantowalo nam ze nie zdarzy sie taka sytuacja, ze jakis diament zostanie policzony w dwoch sciezkach jednoczesnie. Tutaj takiej gwarancji nie mamy i gdybysmy teraz tez zastosowali algorytm sporawdzajacy 4 mozliwe sytuacjie wczesniejsze to moglyby zostac liczone sciezki z pokrywajacymi sie diamentami.
Przykladowo bedac w kolumnie 'k' obliczylismy maxymalna ilosc diamentow dla pierwszej sciezki konczacej sie w wierszu 'w1' oraz dla drugiej sciezki konczacej sie w wierszu 'w2=w1+1' i akurat w tych dwoch polach sa diamenty. Teraz rozpatrujemy pare takich sciezek ze pierwsza konczy sie w wierszu 'w2' a druga w wierszu 'w2+1' (gdzie tez jest diement). Sprawdzajac 4 mozliwe przypadki tak jak w poprzednim algorytmie moze sie okazac ze maximum uzyskamy gdy do elementu ostatniego pierwszej sciezki dostaniemy sie idac z gory i tak samo dla drugiej sciezki (tez od gory). Dodamy do wyniku 2 diamenty znajdujace sie na koncach tych sciezek no i teraz mamy problem, poniewaz diament dodany jako koncowy dla pierwszej sciezki byl juz policzony w drugiej sciezce jako element przedostatni. Z takim problemem mozemy sie spotkac jedynie wtedy gdy sie okazuje ze najlepszym 'dojsciem' do aktualnie rozpatrywanego koncowego elementu drugiej sciezki jest 'dojscie' od gory. Poniewaz nie mamy gwarancji czy pewne diamenty na tej optymalnej sciezce (drugiej sciezce->przed druga sciezke rozumiem ta sciezke ktora sie konczy nizej) nie pokrywaja sie z pewnymi diamentami na pierwszej sciezce i nie mozna tego w latwy sposob wyeleminowac (bo te elementy moga sie pokywac w calej kolumnie od wiersza nr 1 do wiersza nr w1 (gdzie w1 to nr aktualnie rozpatrywanego wiersza dla pierwszej sciezki).... Bycmoze jakos daloby sie to rozwiazac ale ja nie wiem jak. W kazdym razie mozna tutaj podejsc troche inaczej do problemu. Zamiast sprawdzac 4 mozliwe bezposrednie sytuacje jakie sie mogly zdarzyc dla sciezek o 1 krotszych to mozemy rozpatrzec w1 * (w2 - w1 + 1) stuacji w poprzedniej kolumnie.
w1 i w2 to aktualnie rozpatrywane wiersze w ktorych sie koncza odpowiednio pierwsz i druga sciezka w naszej 'k' tej kolumnie. Wezmy zatem kolumne 'k'-1. Aby nasza sciezka konczyla sie w kolumnie 'k'tej w wierszu 'w1' to w kolumnie 'k'-1 musielismy skrecic w prawo na jednym z wierszy od 1 do 'w1'. Podobnie z druga sciezka. Zeby druga sciezka konczyla sie w wierszu 'w2' w kolumnie 'k' to w kolumnie 'k'-1 musielismy skrecic w prawo w jedyn z wierszy 'w1'+1 do 'w2' (tzn to co napisalem apropo drugiej sciezki jest nie do konca prawdziwe bo teoretycznie moglibysmy skrecic w prawo na jakims z wierszy <=w1 lecz wtedy pewien fragment sciezki 2 musialby sie pokrywac ze sciezka 1, a tego chcemy uniknac. no ale mozna latwo zauwazyc ze jesli zamiast skrecac w prawo na jakims wierszy <=w1 i pokywac sie ze sciezka 1 to sciezka 2 rownie dobrze moze isc w dol az do wiersza 'w1'+1 i dopiero tam skrecic w prawo. napewno na tym nic nei stracimy bo jedynie uzikamy pokrywania sie sciezek).
No takze problem rozwiazany. Musimy sprawdzic te w1*(w2-w1+1) mozliwych poprzednikow z poprzedniej kolumny i dla kazdego tego przypadku sprawdzic jeszcze ile diamentow z kolumny 'k'tej zostanie dodatkowo zebranych w zaleznosci od miejsca w ktorym skrecamy w prawo dla kazdej ze sciezek 1 i 2 w kolumnie 'k'-1. No ale tutaj pojawia sie drugi problem bo musimy to obliczyc w czasie stalym :). Robiac to najbardziej brutalny sposob zlozonosc algorytmu wzrosla by do n^5. No ale okazuje sie ze mozna to zrobic w czasie stalym i to w calkiem prosty sposob.
Zauwazmy ze jesli rozpatrujemy uklad w1 i w2 (w2>=w1 - druga sciezka moze sie zawsze konczyc nizej) w 'k'-tej kolumnie to mamy juz policzona maxymakna wartosc diamentow dla ukladu w1, w2-1 (no bo zakladam ze przetwarzamy pary w podwojnej petli najpierw po w1 potem po w2). No a zeby policzyc uklad w1, w2-1 rozpatrzylismy juz wszystkie przypadki gdy pierwsza sciezka skrecala w prawo w 'k'-1 kolumnie na jednym z wierszy 1 do w1 a druga sciezka skrecala w prawo na jednym z wierszy od w1+1 do w2-1 i maxymalna wartosc diamentow dla ukladu w1, w2-1 rozpatruje te wszystkie przypadki. Teraz chcemy policzyc uklad w1, w2. Wiec bierzemy to co mamy obliczone dla ukladu w1, w2-1 i dodajemy 1(lub nic) w zaleznosci czy na pozycji (k, w2) znajduje sie diament... po prostu probujemy przedluzyc druga sciezke z ukladu w1,w2-1 o 1 idac w dol. W ten sposob dla naszego ukladu w1, w2 musimy rozpatrzec jeszcze jedynie przypadki gdy druga sciezka skrecala w kolumnie 'k'-1 dokladnie w wierszu w2 (tylko te przypadki sa jeszcze nie policzone) a sciezka pierwsza w dowolnym z wierszy 1 do w1. Tego sie niestety juz nie da wydobyc z zadnych juz policzonych ukladow koncowych elementow pewnych dwoch sciezek i musielibysmy liniowo sprawdzic te wszystkie przypadki, no ale zlozonosc bylaby wtedy n^4 wiec dalej za duzo. Mozna to jednak zrobic w inny sposob. Zamiast rozpatrywac te pozostale w1 przypadkow w kolumnie 'k' dla ukladu w1,w2, to mozemy to obliczac w druga strone. A mianowicie przy rozpatrywaniu kazdego z przypadkow 'wx<=w1' 'wy=w2' w kolumnie 'k'-1 wiemy ze bedziemy ich potrzebowac przy obliczaniu ukladu w1,w2 w kolumnie 'k'. Mozemy zatem juz bedac w kolumnie 'k'-1 aktualizowac maximum dla kolumny 'k' i ukladu w1,w2 zanim dojdziey do tego uklady w naszym dynamicznym przetwarzaniu po kolumnach. Z tym ze znowu pojawia sie problem, poniewaz kazdy z ukladow wx, wy w kolumnie 'k'-1 takich jak napisalem wyzej jest potrzebny w wiecej niz jedynym ukladzie dla kolumny 'k'. Dla pzykladu uklad (wx=2, wy=w2) jest potrzebny w kazdym z ukladow (2<=wz<w2, w2) dla kolumny 'k'. I teraz znowu musielibysmy liniowo aktualizowac maxima w tych wszystkich ukladach. No ale z tym sobei akurat mozemy poradzic. Maxymalna ilosc diamentow z ukladu 'wa', 'wb' w kolumnie 'k'-1 jest potrzebna do obliczenia maximum w kolumnie 'k' jedynei dla ukladow ktorych druga sciezka rowniez konczy sie w 'wb'. Mozemy zatem zrobic tak zeby uklad 'wa' 'wb' w kolumnie 'k'-1 aktualizowal jedynei uklad 'wa' 'wb' w kolumnie 'k'. A dokladniej mowiac.... jesli przerabiamy uklad 'wa' 'wb' to oznacza to ze musielismy juz przerobic uklad 'wa'-1 'wb' i zaktualizowalismy uklad 'wa'-1 'wb' w kolumnie 'k'. Skoro tak to mozemy uzyc tego co juz mamy w kolumnie 'k' (policzonego jakby z wyprzedzeniem) la ukladu 'wa'-1 'wb' i wziac maximum z tego co tam jest (+ ewentualny diament na pozycji (k, wa)) oraz z tego co aktualnie policzylismy dla ukladu 'wa' 'wb' w kolumnie 'k'-1 + ewentualne diamenty na pozycjach (k, wa), (k, wb). No i maximum z tych dwoch rzeczy zapisumey (z pyprzedzeniem) w kolumnie 'k' dla ukladu ('wa', 'wb'). Postepujac w taki sposob zapewnimy ze dla kolumny o jeden wiekszej kazdy uklad (zanim go naprawde bedziemy przetwarzac w naszym algorytmie) bedzie mial juz rozwazone wszystkie przypadki gdy do ostatniego pola drugiej sciezki dostajemy sie z lewej strony. A pozostale przypadki sprawdzimy juz przy bezposrednim przetwarzaniu danego ukladu i zrobimy to patrzac sie jedynie do wartosci dla ukladu z drugim wierszem o jeden mniejszym czyli w czasie stalym.

Jesli chodzi o zlozonosc: mamy 'w' kolumn i w kazdej z nich rozwazamy h*(h+1)/2 ukladow. Przetwarzanie kazdego z ukladow to 2 operacje, a zatem biorac jako jednostke kazda z tych operacji dostajemy (z dokladnoscia do stalej)
zlozonosc: O(w*h^2)

Hmm. :) ciekaw jestem czy ktokolwiek zrozumi to co napisalem odnosnie tego mojego sposobu:D. W kazdym razie powiem tyle ze moze tlumaczenia jest duzo zeby to zrozumiec, ale jesli chodzi juz o implmementacje to ten algorytm wydaje mi sie prostszy (wbrew pozorom) niz ten poprzedni. Zarowno aktualizacja kolumny nastepnej (z wyprzedzeniem) jak i rozwazenie pozostalych przypadkow przy rzeczywistym przetwarzaniu danego ukladu to sa instrukcje jednolinijkowe.
No a pozatym ten algorytm ma mniejsza stala jesli sie nei myle.



No nic. to chyba tyle :) ze tez mi sie chcialo to pisac:P mam nadzieje ze przynajmniej na tyle zrozumiale to napisalem ze sie to komus przyda.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysłany: Wto 6:07, 31 Paź 2006    Temat postu:

Heh, przepchnalem wlasnie i wchodze na forum z zamiarem spisania 'opisu przejscia'... a tutaj taki prezencik od Matea :D

Mateo - rispekt, ze Ci sie chcialo tyle napisac.

Rogal - dzieki za binarke do testow, ale sie krzaczy ;)) Gdzie, to lepiej na priva Ci wysle, bo by Ci jeszcze TCS mogl jakis test dowalic i cofnac OKeya ;)
(Chyba, ze to jakas wina wczytywania lub mojego zlego wygenerowania pliku wejsciowego)

Anyway, [link widoczny dla zalogowanych] lezy binarka do generowania testow - jak zwykle instrukcja po wlaczeniu bez parametrow. Of koz nie odpowiadam za nia, moze sie krzaczyc - mi raczej dobrze dzialala. (Mowie, bo niektorzy mi dawali info, ze ktorys tam moj generator cos zle zliczal - nie wgralem wtedy ostatniej wersji na serwer, chyba pozniej ja update'nalem)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Spectro
Mistrz grilla



Dołączył: 09 Mar 2006
Posty: 2306
Przeczytał: 0 tematów

Skąd: Kurdwanów

PostWysłany: Wto 9:29, 31 Paź 2006    Temat postu:

Faktycznie, robiłem pierwszym sposobem, ale:

mateo napisał:
O(2*hw*min(h,w))

Nie mylę się. Po pierwsze jest to notacja "o duże" a nie "theta duże", a po drugie po rozpisaniu obu wzorow dla min(h,w)=w oraz min(h,w)=h wychodzi to samo :P .
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Rogal
Zjeb z kaszanką



Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów

Skąd: koło podbiegunowe

PostWysłany: Wto 9:40, 31 Paź 2006    Temat postu:

cct napisał:
Rogal - dzieki za binarke do testow, ale sie krzaczy ;)) Gdzie, to lepiej na priva Ci wysle, bo by Ci jeszcze TCS mogl jakis test dowalic i cofnac OKeya ;)
(Chyba, ze to jakas wina wczytywania lub mojego zlego wygenerowania pliku wejsciowego)

To napisz na tego prive'a :D
Acz algorytm wydawał mi się poprawny...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
r4ku
żul



Dołączył: 09 Lut 2006
Posty: 722
Przeczytał: 0 tematów

Skąd: klikash? :D

PostWysłany: Wto 11:28, 31 Paź 2006    Temat postu:

@mateo: respekcik

rozpisalem sobie wczoraj algorytm po dlugosci sciezek ale nie bylem pewien jego poprawnosci w moim wydaniu, okazalo sie jednak ze jest on izomorficzny z pierwsza metoda wiec biore sie za kodzenie :D
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mateo
pijak



Dołączył: 08 Mar 2006
Posty: 296
Przeczytał: 0 tematów

Skąd: Krk - Biały Prądnik

PostWysłany: Wto 11:53, 31 Paź 2006    Temat postu:

Spectro napisał:
Faktycznie, robiłem pierwszym sposobem, ale:

mateo napisał:
O(2*hw*min(h,w))

Nie mylę się. Po pierwsze jest to notacja "o duże" a nie "theta duże", a po drugie po rozpisaniu obu wzorow dla min(h,w)=w oraz min(h,w)=h wychodzi to samo :P .


Heh, no w sumie tak:P
Mi tutaj chodzilo tylko o to, ze pomimo iz algorytm idzie po wszystkich dlugosciach od 1 do w+h-2 i dla kazdej dlugosci sprawdza kwadratwa ze wzgledu na minim z w i h ilosc par to to sie troche amorytuzuje przez rozne dlugosci przeakatnych i tak na prawde dokladniej to liczac mozna pominac ta sume i wystarczy tylko wiekszy z wymiarow tablicy. Tzn to co ja tam policzylem to jest juz nie tyle zlozonosc a dokladna ilosc operacji sprawdzania pewnego poprzednika. Chcialem po prostu porownac te 2 algorytmy, ktore opisalem, a piszac ((w+h)*min(w,h)^2) by to nie do konca oddawalo ile rzeczywiscie dziala ten pierwszy algorytm. No ale nie da sie ukryc ze zarowno pierwszy zapis jaki ten podany przez ciebie jest tak samo dobry do wrzucenia i to nie tylko pod O duze ale pod THETA duze. Widocznie sie zmotalem troche:P W kazdym razie przyznaje racje..
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych Wszystkie czasy w strefie EET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin