Dan je niz $S = {a_1} {a_2} \dots {a_n}$, kjer so ${a_i}$ ($1 \le i \le n$) elementi neke končne abecede. Nizu ${a_j} {a_{j+1}} \dots {a_k}$, kjer je $1 \le j \le k \le n$, pravimo strnjen podniz niza $S$. S pomočjo dinamičnega programiranja napiši algoritem, ki določi najdaljši palindromski strnjen podniz v $S$.
Dana je matrika $A = (a_{ij})_{i,j=1}^{m,n}$. Poiskati želimo strnjeno podmatriko matrike $A$ z največjo vsoto komponent.
Reši problem za matriko
\[A = \begin{pmatrix} 1 & -1 & 2 & 4 \\ -3 & -2 & 8 & 2 \\ -3 & 2 & -2 & 4 \\ 1 & -5 & -1 & -2 \end{pmatrix} .\]Napiši rekurzivne enačbe za opisani problem.
Napiši algoritem, ki reši opisani problem. Oceni tudi njegovo časovno zahtevnost v odvisnosti od $m$ in $n$.
Na ulici je $n$ vrstnih hiš, pri čemer je v $i$-ti hiši ${c_i}$ denarja. Tat se odloča, katere izmed hiš naj oropa. Vsak oropan stanovalec to sporoči svojim sosedom, zato tat ne sme oropati dveh sosednjih hiš. Ker je tat poslušal predmet Operacijske raziskave, pozna dinamično programiranje. Pokaži, kako naj tat določi, katere hiše naj oropa.
Imamo hlod dolžine $\ell$, ki bi ga radi razžagali na $n$ označenih mestih $0 < {x_1} < {x_2} < \dots < {x_n} < \ell$. Eno rezanje stane toliko, kolikor je dolžina hloda, ki ga režemo. Ko hlod prerežemo, dobimo dva manjša hloda, ki ju režemo naprej. Poiskati želimo zaporedje rezanj z najmanjšo ceno.
graph TD
04[0 - 10: 23] --- 01[0 - 5: 5]
04 --- 24[5 - 10: 8]
01 --- 00[0 - 3]
01 --- 11[3 - 5]
24 --- 23[5 - 8: 3]
24 --- 44[8 - 10]
23 --- 22[5 - 7]
23 --- 33[7 - 8]
Na voljo imamo kovance z vrednostmi $1 = {v_1} < {v_2} < \cdots < {v_n}$ in vsoto $C$, ki jo želimo izplačati s kovanci. Predpostavljamo, da imamo dovolj velik nabor kovancev.
Imamo zaporedje $n$ polj, pri čemer je na $i$-tem polju zapisano število ${a_i}$. Na voljo imamo še $\lfloor n/2 \rfloor$ domin, z vsako od katerih lahko pokrijemo dve sosednji polji. Vsaka domina je sestavljena iz dveh delov: na enem je znak $+$, na drugem pa znak $-$. Posamezno polje lahko pokrijemo z le eno domino; če sta pokriti dve sosednji polji, morata biti pokriti z različnima znakoma (bodisi z iste, bodisi z druge domine). Iščemo tako postavitev domin, ki maksimizira vsoto pokritih števil, pomnoženih z znakom na delu domine, ki pokriva število. Pri tem ni potrebno, da uporabimo vse domine.
Primer dopustnega (ne nujno optimalnega) pokritja:
[+ | -] | [- | +] | [- | +] | |||
---|---|---|---|---|---|---|---|---|
6 | 3 | -4 | 2 | -3 | 5 | 9 | 1 | 2 |
Vsota tega pokritja je $3 - (-4) - 5 + 9 - 1 + 2 = 12$. Če bi eno od zadnjih dveh domin obrnili (zamenjala bi se znaka), dobljeno pokritje ne bi bilo dopustno, saj bi dve zaporedni polji bili pokriti z enakima znakoma.
Zapiši rekurzivne enačbe za reševanje danega problema. Razloži, kaj predstavljajo spremenljivke, v kakšnem vrstnem redu jih računamo, ter kako dobimo optimalno rešitev.
Namig: posebej obravnavaj dva primera glede na postavitev zadnje domine.
Oceni časovno zahtevnost algoritma, ki sledi iz zgoraj zapisanih enačb.
S svojim algoritmom poišči optimalno pokritje za zgornji primer.