Asosiy qismga o‘tish

9. Dinamik dasturlash

Nazariya

Fikr

Dinamik dasturlash (DD) — masalani kichik qismlarga bo‘lib, har birini
bir marta yechish va natijani saqlab qo‘yish.

Ikki shart:

  1. Optimal qism struktura — katta javob kichiklaridan quriladi;
  2. Qismlar takrorlanadi — bir xil kichik masala qayta-qayta

uchraydi (aynan shuning uchun saqlash foyda beradi).

Zinapoya

Zinapoyada n ta zina. Bir yoki ikki qadam tashlash mumkin. Necha xil
yo‘l bor?

dp = [0] * (n + 1)
dp[0] = 1
dp[1] = 1
for i in range(2, n + 1):
    dp[i] = dp[i - 1] + dp[i - 2]
print(dp[n])

dp[i] — i-zinaga yetishning yo‘llari soni. Bu Fibonachchi bilan bir
xil rekurrent munosabat.

DD ni qurish tartibi

  1. Holatni aniqlang: dp[i] nimani anglatadi?
  2. Bazani yozing: eng kichik holat javobi.
  3. O‘tishni yozing: dp[i] oldingilaridan qanday olinadi?
  4. Tartibni tanlang: qaysi holat oldin hisoblanishi kerak?
  5. Javobni ayting: qaysi katakda turadi?

Ryukzak (0/1)

W og‘irlikka sig‘adigan eng qimmat to‘plam:

dp = [0] * (W + 1)
for ogirlik, qiymat in buyumlar:
    for w in range(W, ogirlik - 1, -1):     # teskari!
        dp[w] = max(dp[w], dp[w - ogirlik] + qiymat)
print(dp[W])

Teskari yurish muhim: aks holda bitta buyum bir necha marta olinadi.

Ikki yo‘l

Pastdan yuqoriga (sikl bilan) — tezroq va xotirani boshqarish
oson. Yuqoridan pastga (rekursiya + lru_cache) — yozish oson,
holat murakkab bo‘lganda qulay.

Xotirani tejash

dp[i] faqat dp[i-1] va dp[i-2] ga bog‘liq bo‘lsa, butun massiv
shart emas — ikkita o‘zgaruvchi yetadi.

Misol

n = int(input())
a, b = 1, 1
for _ in range(n - 1):
    a, b = b, a + b
print(a)

Mashq masalalari

Nazorat savollari

1 Dinamik dasturlash qachon qo‘llaniladi? Bitta to‘g‘ri javob
2 Zinapoya masalasida `dp[i]` nimani anglatadi? Bitta to‘g‘ri javob
3 n = 5 bo‘lsa, zinapoya masalasining javobi nechchi? Kod nima chiqaradi
dp = [0] * 6
dp[0] = dp[1] = 1
for i in range(2, 6):
    dp[i] = dp[i-1] + dp[i-2]
print(dp[5])
4 Memoizatsiyali rekursiya ham dinamik dasturlashning bir ko‘rinishi. To‘g‘ri yoki noto‘g‘ri
5 0/1 ryukzakda ichki sikl nega teskari yuradi? Bitta to‘g‘ri javob
6 DD yechimini qurishda qaysi qadamlar bor? Bir nechta to‘g‘ri javob

Bir nechta javob to‘g‘ri bo‘lishi mumkin.

7 Zinapoya masalasining o‘tish formulasini to‘ldiring. Bo‘sh joyni to‘ldirish
dp[i] = dp[i - 1] + dp[i - ____]
8 `dp[i]` faqat `dp[i-1]` va `dp[i-2]` ga bog‘liq bo‘lsa, nechta o‘zgaruvchi yetarli? Qisqa javob — yoziladi
9 Ochko‘z xato javob beradigan tanga masalasini dinamik dasturlash to‘g‘ri yechadi. To‘g‘ri yoki noto‘g‘ri
10 Fibonachchini memoizatsiyasiz rekursiya bilan hisoblash nega yomon? Bitta to‘g‘ri javob

Javoblar serverda tekshiriladi. Katta-kichik harf, apostrof shakli va ortiqcha bo‘shliq ahamiyatsiz.