Dinamikus
programozás II
Feladatok:
1. Adott egy n elemű
számsorozat az a[0..n-1]
tömbben.
Írjunk programot, mely meghatározza a leghosszabb,
szigorúan növekvő részsorozatát.
Részsorozat
alatt nem feltétlenül összefüggő
karaktersorozatot
értünk.( Pszeudokód
)
2.
Adott két számsorozat az a[1..n]
és a b[1..m]
tömbökben. Írjunk programot, mely meghatározza
a leghosszabb
közös részsorozatukat.(
Pszeudokód )
3. Adott egy H cm
hosszú polc és n könyv,
amelyeknek
ismert a vastagságuk cm-ben. Legyen
az i-edik könyv
vastagsága vi,
ahol i = 1 ... n. Írjunk
programot, mely meghatározza, hogy milyen könyveket
tegyük fel a polcra, ha teljesen meg szeretnénk
tölteni
a polcot, a lehető legtöbb könyvet használva?
1.
// a tömb
feltöltése
c[n] = 0
minden
i = n-1 .. 0, végezd
c[i] = 0
minden
j = i+1 .. n végezd
ha
a[i] < a[j] és c[i] < c[j] akkor
c[i] = c[j]
vége
ha
vége
minden
c[i]
=
c[i]+1
vége
minden
kiírás
"A
leghosszabb szigorúan növekvő részsorozat hossza:"
m = max(c), pozíciója:
mp
// tömbeli elemek kiertekelese: a részsorozat
meghatározása
u
= mp
kiiras a[u]
minden
i = u + 1 .. n végezd
ha a[u] < a[i] és c[i] == c[u] - 1 akkor
kiírás a[i]
u = i
vége ha
vége
minden
példa1:
a = {3,10,12,5,8,6,20,11};
kimenet:
c = {4,3,2,3,2,2,1,1}
a
részsorozat hossza: 4
a részsorozat: {3, 10, 12, 20}
példa2:
a = {8,3,5,11,6,20,32,4,13,17,9,2,15};
kimenet:
c = {4,5,4,3,3,2,1,3,2,1,2,2,1}
a részsorozat hossza: 5
a részsorozat: {3, 5, 11, 20, 32}
2.
//
inicializálás
minden i = 0 ..
n végezd
c[i][m]=0
vége
minden
minden
j = 0 .. m végezd
c[n][j]=0
vége
minden
// a tömb feltöltése
minden
i = n-1 .. 0 végezd
minden j = m-1 .. 0 végezd
ha a[i] == b[j] akkor
c[i][j] = c[i+1][j+1]+1
különben
ha c[i][j+1] > c[i+1][j] akkor
c[i][j] =
c[i][j+1]
különben c[i][j] =
c[i+1][j]
vége ha
vége ha
vége minden
vége
minden
kiírás
"A leghosszabb közös részsorozat hossza:",
c[0][0]
//
tömbbeli elemek kiertékelése: a közös
részsorozat
meghatározása
i = 0
j = 0
amig
i
< n és j < m végezd
ha a[i] == b[j] akkor
kiírás a[i]
i = i + 1
j = j + 1
különben
ha c[i][j] == c[i][j+1] akkor j = j + 1
különben i = i + 1
vége ha
vége ha
vége
amig
példa1:
a = {3,6,12,4,5,8,13,7,10};
b = {1,2,3,4,6,7,8,12,13};
kimenet:
c =
4 4 4 3 3 2 2 2 1 0
3 3 3 3 3 2 2 2 1 0
3 3 3 3 2 2 2 2 1 0
3 3 3 3 2 2 2 1 1 0
2 2 2 2 2 2 2 1 1 0
2 2 2 2 2 2 2 1 1 0
1 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
a leghosszabb közös részsorozat hossza: 4
a részsorozat: {3, 6, 12, 13}