[ TRIŠESTPET @ 13.07.2004. 19:41 ] @
Molim pomoc ( ideje ... ) u vezi ovog zadatka sa USACO-a . Sljedi copy/paste da ne bi bilo nekih pitanja ...

Consider the number triangle shown below. Write a program that calculates the highest sum of numbers that can be passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

In the sample above, the route from 7 to 3 to 8 to 7 to 5 produces the highest sum: 30.

PROGRAM NAME: numtri
INPUT FORMAT
The first line contains R (1 <= R <= 1000), the number of rows. Each subsequent line contains the integers for that particular row of the triangle. All the supplied integers are non-negative and no larger than 100.
SAMPLE INPUT (file numtri.in)
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

OUTPUT FORMAT
A single line containing the largest sum using the traversal specified.
SAMPLE OUTPUT (file numtri.out)
30


[ Alef @ 13.07.2004. 21:52 ] @
Možeš da napraviš binarno stablo sa elementima (brojevima) koje si dobio, rekurzivno isprobaš sve moguće putanje i da zbirove slažeš u niz koji ima elemenata (toliko ima putanja), gde je n broj vrsta. Onda nađeš najveći element niza.
Koliko vidim samo se najveći zbir i traži, ne i putanja.
[ filmil @ 13.07.2004. 22:32 ] @
Rešenje može dosta da se ubrza ako se vidi da od tih svih puteva mnogi imaju zajedničke parcijalne puteve. Ovo je verovatno jedan od osnovnih problema u kojima može da se iskoristi tzv. dinamičko programiranje.

Posmatramo n-ti red trougla, i neki broj u njemu (recimo dvojka u poslednjem redu).

Pitamo se: koji je najveći mogući zbir među svim putevima koji se završavaju u tom broju. Pošto tih zbirova očigledno ima mnogo, na prvi pogled je nejasno kako možemo sve da ih pregledamo i pronađemo najveći. Međutim, postoji jednostavan trik koji rešava stvar.

Sve putanje koje se završavaju u broju 2 moraju da prođu kroz brojeve koji su gore-levo, odn. gore-desno u šemi (to su 4 odn. 7). Pretpostavimo sada da znamo koji su maksimalni zbirovi svih puteva koji se završavaju u 4, odn. u 7. Ako to znamo onda znamo i sledeće: maksimalni zbir svih puteva koji se završavaju u 2 jednak je većem od zbirova puteva za 4 i 7, uvećanom za 2.

Dakle AKO znamo maksimalne zbirove za 4 i 7, možemo da „proizvedemo“ maksimalni zbir za 2 jednostavnom operacijom (maksimum plus vrednost broja). Ostaje nam još da nekako sračunamo zbirove za 4 i za 7. To se može učiniti na isti način, gledanjem maksimalnih zbirova koji su gore-levo, odn. gore-desno, računanje maksimuma itd.

Još treba da se primeti da je sve maksimume u jednom redu moguće sračunati ako su poznati maksimumi iz prethodnog reda. Sada je rešenje jednostavno: pre nego što sračunamo maksimum u jednom redu, sračunaćemo sve maksimume u prethodnom, a zatim na osnovu njih i maksimume u tekućem.
Zahvaljujući tome što u ranijim redovima ima manje brojeva, problem je jednostavniji. Najprostije je sračunati maksimum u prvom redu u kome stoji samo jedan broj.

Dakle algoritam je:

– za prvi red, maksimum je jednak prvom i jedinom broju.
– maksimumi za trenutni red se izračunaju na osnovu poznatih maksimuma za prethodni red i gore pomenute formule, novosračunati maksimumi se zapamte za sledeći prolazak kroz petlju.
– pomerimo se na sledeći red i ponovimo prethodno.
– kad izvrtimo petlju za sve redove, prođemo kroz poslednji izračunati niz maksimuma i nađemo koji je najveći element.

f
[ TRIŠESTPET @ 17.07.2004. 14:10 ] @
Dobre ideje, nema sta. Hvala na brzim odgovorima.