Deli in vladaj
graph TD
A --- B
A --- C
B --- D
B --- E
C --- F
C --- G
Dinamično programiranje
graph TD
A --- E
B --- E
B --- F
C --- F
C --- G
D --- G
E --- H
F --- H
F --- I
G --- I
H --- J
I --- J
Na avtocestni odsek dolžine $M$ kilometrov želimo postaviti oglasne plakate. Dovoljene lokacije plakatov določa urad za oglaševanje in so predstavljene s števili ${x_1}, {x_2}, \dots {x_n}$, kjer ${x_i}$ ($1 \le i \le n$) predstavlja oddaljenost od začetka odseka v kilometrih. Profitabilnost oglasa na lokaciji ${x_i}$ določa vrednost ${v_i}$ ($1 \le i \le n$). Urad za oglaševanje podaja tudi omejitev, da mora biti razdalja med oglasi vsaj $d$ kilometrov. Oglase želimo postaviti tako, da bodo čim bolj profitabilni.
$i$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
${x_i}$ | 1 | 2 | 8 | 10 | 12 | 14 | 17 | 20 |
${v_i}$ | 8 | 8 | 12 | 10 | 7 | 5 | 6 | 10 |
${p_i}$ | 8 | 8 | 20 | 20 | 20 | 25 | 26 | 35 |
Rešitev:
def plakati(x, v, d): # predpostavimo, da je x urejen
n = len(x)
assert n == len(v) # preveri, da velja zapisani pogoj
x = [-float('inf'), *x]
v = [0, *v]
p = [0]
j = 0
for i in range(1, n+1):
while x[j+1] <= x[i] - d:
j += 1
p.append(max(p[i-1], p[j] + v[i]))
m = []
i = n
while i > 0:
if p[i] > p[i-1]:
m.append(i)
y = x[i]
while x[i] > y - d:
i -= 1
else:
i -= 1
return (p[n], list(reversed(m)))
Časovna zahtevnost: $O(n)$
Imamo nahrbtnik nosilnosti $M$ kilogramov. Danih je $n$ objektov z vrednostmi ${v_i}$ in težami ${t_i}$ ($1 \le i \le n$). Problem nahrbtnika sprašuje po izbiri predmetov $I \subseteq {1, 2, \dots, n}$, ki maksimizira njihovo skupno vrednost pri omejitvi $\sum_{i \in I} t_i \le M$.
Dana je matrika $A = (a_{ij})_{i,j=1}^{m,n}$. Poiskati želimo pot minimalne vsote, ki se začne v levem zgornjem kotu (pri $a_{11}$) in konča v desnem spodnjem kotu (pri $a_{mn}$). Dovoljeni so zgolj premiki v desno in navzdol.
Reši problem za matriko
\[A = \begin{pmatrix} 131 & 673 & 234 & 103 & 18 \\ 201 & 96 & 342 & 965 & 150 \\ 630 & 803 & 746 & 422 & 111 \\ 537 & 699 & 497 & 121 & 956 \\ 805 & 732 & 524 & 37 & 332 \end{pmatrix} .\]Napiši rekurzivne enačbe za opisani problem.
Na osnovi rekurzivnih enačb napiši algoritem, ki reši opisani problem. Oceni tudi njegovo časovno zahtevnost v odvisnosti od $m$ in $n$.