Társasjáték – megoldás

2013.04.03. 05:47

Az eredeti feladat itt.

Megoldás

Ez egy meglehetősen sztenderd dinamikus programozási feladat. Jelöljük F(i,j)-vel azt, hogy az i-edik mezőről indulva hányféleképp juthatunk el az N-edikre legfeljebb j dobással. Mindössze annyit kell észrevennünk, hogy teljesül a következő rekurzió:

F(i,j) = F(i+1,j-1) + F(i+2,j-1) + F(i+3,j-1) + F(i+4,j-1) + F(i+5,j-1) + F(i+6,j-1)

feltéve persze, hogy i <= N-6. Hiszen azon esetek száma, amikor első dobásként k-t dobunk, pontosan F(i+k,j-1)-gyel egyenlő. Ha i közel van N-hez, ugyanezen gondolatmenettel akkor is felírható egy hasonló képlet (ami kicsit kuszább lesz ennél), de azt is észrevehetjük, hogy i > N-6-ra F(i,j) = 5 * F(i,j-1) + 1. Arra is figyeljünk oda, hogy F(N,j) = 1 minden j-re. A válasz, amit keresünk F(1,K).

Tehát a dinamikus megoldás az összes F(i,j) érték kiszámolásával történik, az F(i,0) = 0 (i<N) illetve F(N,j) = 1 kezdőfeltételek mellett. Ezt kisebb adatokra egy N-szer K-s tömbben is megoldhatnánk, itt azonban ehhez nincs elég memória, meg hát amúgy sincs szükség rá: egy egydimenziós, N elemű tömbben is megoldható az egész, ha rögzített j-re az i-ken növekvő sorrendben megyünk végig. (Ekkor ugyanis nyugodtan felülírhatjuk az F(i,j-1) értéket F(i,j)-vel, nem vész el a későbbiekben szükséges információ.)

A futásidő tehát O(NK), míg a memóriából csak N-nel arányosan foglaltunk.

Megoldásom (nem a hivatalos megoldás!)

A bejegyzés trackback címe:

https://versenyprogramozas.blog.hu/api/trackback/id/tr335165015

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.