Bölüm 6: Dinamik Programlama

Bölüm 6: Dinamik Programlama · Çalışma Soruları
Temel kavramlarFibonacci0/1 sırt çantasıSınırsız sırt çantasıAlt küme toplamıEn uzun artan alt diziOrtak alt dizgi ve LCS
Sercan KÜLCÜ

Çoktan Seçmeli · Temel Kavramlar

Soru 1: DP'nin İki Özelliği

Bir problemin dinamik programlamayla verimli çözülebilmesi için hangi iki özelliği taşıması gerekir?

B: Alt problemler tekrar tekrar çağrılmalıdır (tablo işe yarar) ve optimal çözüm alt problemlerin optimal çözümlerinden kurulabilmelidir (Bellman'ın optimallik ilkesi). Açgözlü seçim özelliği açgözlü algoritmaların koşuludur; DP tüm seçenekleri dener.

Çoktan Seçmeli · Temel Kavramlar

Soru 2: Neden Tablo Gerekmez?

Birleştirme sıralaması özyinelemeli olduğu hâlde neden bir DP tablosundan yararlanmaz?

A: Diziyi ikiye bölünce iki yarı ayrık parçalardır; hiçbir alt problem tekrar çözülmez, yani saklanacak tekrar yoktur. Bu böl ve fethettir. Fibonacci'de ise fib(3) gibi alt problemler defalarca çağrılır.

Çoktan Seçmeli · Temel Kavramlar

Soru 3: Durum × İş

"Toplam süre ≈ durum sayısı × bir durumun hesaplanma süresi" kuralına göre O(n²)'lik LIS DP'si için hangisi doğrudur?

C: dp[i] (i'de biten en uzun artan alt dizi) n tane durumdur; her biri önceki tüm j < i değerlerine bakar → O(n) → O(n²). B, ikili aramalı O(n log n) yöntemin (sonlar dizisi) maliyetine benzer; D kaba kuvvetin alt dizi sayısıdır.

Çıktı Sorusu · Fibonacci

Soru 4: Çağrı Sayısı

Düz özyinelemeli fib metoduna bir çağrı sayacı eklendi. Kod ne yazdırır? Aynı hesap derstekiler gibi bellekleme ile yapılsaydı kaç çağrı olurdu?

static int cagri = 0;
static long fib(int n) {
  cagri++;
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}
// main:
System.out.println(fib(7) + " " + cagri);
Cevabı göster
13 41
  • F(7) = 13. Çağrı sayısı 2 · F(n + 1) − 1 = 2 · 21 − 1 = 41: T(n) = T(n − 1) + T(n − 2) + 1.
  • Bellekleme ile her fib(k) en çok bir kez açılır; fib(k) iki kez çağrılır (bir kez hesap, bir kez tablodan) → 2n − 1 = 13 çağrı.

Üstelden doğrusala: Θ(φⁿ) → O(n).

Adım Adım Çalıştırma · Fibonacci

Soru 5: Bellekleme: fib(4)

Bellekleme kullanan fib(4) çağrısında bellek dizisi nasıl dolar; hangi çağrı tablodan yanıtlanır?

bellek0000001234

bellek dizisi 0 ile başlar (0 = "henüz hesaplanmadı"). fib(4) tabloda yok → fib(3) çağrılır.

bellek0000001234

fib(3) tabloda yok → fib(2) çağrılır.

bellek0000001234

fib(2) tabloda yok → fib(1) çağrılır.

bellek0000001234

fib(1): taban durum, 1 döner.

bellek0000001234

fib(2)'de a = 1; şimdi fib(0) çağrılır: taban durum, 0 döner.

bellek0010001234

bellek[2] = 1 + 0 = 1 yazılır ve döndürülür.

bellek0010001234

fib(3)'te a = 1; fib(1) çağrılır → 1 (taban).

bellek0012001234

bellek[3] = 1 + 1 = 2.

bellek0012001234

fib(4)'te a = 2; fib(2) çağrılır: bellek[2] = 1 hazır, hiç alt çağrı yapılmadan döner.

bellek0012301234

bellek[4] = 2 + 1 = 3. Toplam 7 çağrı (2n − 1); düz özyineleme 9 çağrı yapardı.

static long[] bellek = new long[50];

static long fib(int n) {
  if (n <= 1) return n;          // taban
  if (bellek[n] != 0) return bellek[n];
  long a = fib(n - 1);
  long b = fib(n - 2);
  bellek[n] = a + b;
  return bellek[n];
}

Çıktı Sorusu · Fibonacci

Soru 6: Tablolama Çıktısı

Aşağıdaki aşağıdan yukarı (tablolama) kod ne yazdırır? Zaman ve bellek karmaşıklığı nedir; bellek nasıl azaltılabilir?

int n = 8;
int[] t = new int[n + 1];
t[0] = 1; t[1] = 1; t[2] = 1;      // taban
for (int i = 3; i <= n; i++)
  t[i] = t[i - 1] + t[i - 3];
System.out.println(Arrays.toString(t));
Cevabı göster
[1, 1, 1, 2, 3, 4, 6, 9, 13]
  • t[3] = t[2] + t[0] = 2, t[4] = 3 + … : 2 + 1 = 3, t[5] = 3 + 1 = 4, t[6] = 4 + 2 = 6, t[7] = 6 + 3 = 9, t[8] = 9 + 4 = 13.
  • Her hücre bir kez, O(1)'de → O(n) zaman, O(n) bellek.
  • t[i] yalnızca son üç değere bağlıdır; Fibonacci'deki iki değişken fikri gibi üç değişkenle O(1) belleğe iner.

Çoktan Seçmeli · Fibonacci

Soru 7: İki Değişkenli Fibonacci

Dersteki once/simdi değişkenli fib metodu fib(8) için ne döndürür ve ek belleği nedir?

D: 0, 1, 1, 2, 3, 5, 8, 13, 21 → F(8) = 21. Döngü yalnızca son iki değeri tutar: ek bellek O(1), zaman O(n). 34, F(9)'dur (döngü sınırının bir fazla alınması); O(n) bellek tüm diziyi saklayan tablolamadır.

Çoktan Seçmeli · Fibonacci

Soru 8: Bellekleme ve Tablolama

Bellekleme (yukarıdan aşağı) ve tablolama (aşağıdan yukarı) için aşağıdakilerden hangisi yanlıştır?

C yanlıştır: ikisi de her alt problemi bir kez çözer ve asimptotik süreleri aynıdır; tablolama özyineleme çağrısı yapmadığı için pratikte çoğu zaman daha hızlıdır. A, B ve D derste anlatılan özelliklerdir.

Adım Adım Çalıştırma · 0/1 Sırt Çantası

Soru 9: sirtCantasi Tablosu

v = {3, 4, 5, 6}, w = {2, 3, 4, 5}, W = 5 için sirtCantasi tablosu satır satır nasıl dolar? Hangi eşyalar seçilir?

K[i][c] (eşya: v, w)01234500000001 (3,2)2 (4,3)3 (5,4)4 (6,5)

Eşyalar (v, w): (3, 2), (4, 3), (5, 4), (6, 5); W = 5. Tablo 5 × 6; satır 0 ve sütun 0 sıfırdır.

K[i][c] (eşya: v, w)01234500000001 (3,2)0033332 (4,3)3 (5,4)4 (6,5)

i = 1 (3, 2): c ≥ 2 için al → K = 3; c < 2 sığmaz.

K[i][c] (eşya: v, w)01234500000001 (3,2)0033332 (4,3)0034473 (5,4)4 (6,5)

i = 2 (4, 3): c = 3, 4: max(3, 4 + K[1][0..1] = 4) = 4; c = 5: max(3, 4 + K[1][2] = 7) = 7 (iki eşya birden).

K[i][c] (eşya: v, w)01234500000001 (3,2)0033332 (4,3)0034473 (5,4)0034574 (6,5)

i = 3 (5, 4): c = 4: max(4, 5 + 0) = 5; c = 5: max(7, 5 + K[2][1] = 5) = 7 (alma).

K[i][c] (eşya: v, w)01234500000001 (3,2)0033332 (4,3)0034473 (5,4)0034574 (6,5)003457

i = 4 (6, 5): c = 5: max(7, 6 + K[3][0] = 6) = 7 (alma). Satır öncekiyle aynı kalır.

K[i][c] (eşya: v, w)01234500000001 (3,2)0033332 (4,3)0034473 (5,4)0034574 (6,5)003457

K[4][5] = 7. Geri okuma: K[2][5] = 7 ≠ K[1][5] = 3 → eşya 2 alındı (c = 2); K[1][2] = 3 ≠ 0 → eşya 1 alındı. 3 + 4 = 7, ağırlık 5.

int sirtCantasi(int[] v, int[] w, int W) {
  int n = v.length;
  int[][] K = new int[n + 1][W + 1];
  for (int i = 1; i <= n; i++)
    for (int c = 1; c <= W; c++) {
      int vi = v[i - 1], wi = w[i - 1];
      if (wi > c)            // sığmaz
        K[i][c] = K[i - 1][c];
      else                   // alma / al
        K[i][c] = Math.max(K[i - 1][c],
                    vi + K[i - 1][c - wi]);
    }
  return K[n][W];
}

Çıktı Sorusu · 0/1 Sırt Çantası

Soru 10: En Büyük Değer

Eşyalar (v, w): (10, 5), (40, 4), (30, 6), (50, 3); kapasite W = 10. 0/1 sırt çantası tablosunun son satırını, en büyük değeri ve seçilen eşyaları bulun.

Cevabı göster
iK[i][0..10]
10 0 0 0 0 10 10 10 10 10 10
20 0 0 0 40 40 40 40 40 50 50
30 0 0 0 40 40 40 40 40 50 70
40 0 0 50 50 50 50 90 90 90 90

K[4][10] = 90. Geri okuma: K[4][10] = 90 ≠ K[3][10] = 70 → eşya 4 (c = 7); K[3][7] = K[2][7] = 40 → eşya 3 yok; K[2][7] = 40 ≠ K[1][7] = 10 → eşya 2 (c = 3); K[1][3] = 0 → eşya 1 yok.

Seçim: eşya 2 + eşya 4 (40 + 50, ağırlık 7). Kalan 3 kg'a başka eşya sığmaz.

Çoktan Seçmeli · 0/1 Sırt Çantası

Soru 11: Açgözlü Neden Yanılır?

W = 10; eşyalar (değer, ağırlık): (30 ₺, 6 kg), (20 ₺, 5 kg), (20 ₺, 5 kg). Değer/ağırlık oranına göre açgözlü seçim ve optimal 0/1 çözüm kaç ₺ verir?

A: Oranlar 5, 4, 4: açgözlü önce 6 kg'lık eşyayı alır; kalan 4 kg'a 5 kg'lık eşyalar sığmaz → 30 ₺. İki 5 kg'lık eşya birlikte 10 kg, 40 ₺ eder. 50 ₺ ağırlık sınırını aşar (11 kg). Açgözlü yalnızca kesirli sırt çantasında optimaldir.

Çıktı Sorusu · 0/1 Sırt Çantası

Soru 12: Döngü Yönü

Tek eşya (değer 10, ağırlık 3) ve kapasite 9 için tek boyutlu tablo iki farklı yönde dolduruluyor. Kod ne yazdırır? Hangisi 0/1 sırt çantasıdır?

int v = 10, w = 3, W = 9;
int[] dp = new int[W + 1];
int[] dq = new int[W + 1];
for (int c = W; c >= w; c--)   // büyükten küçüğe
  dp[c] = Math.max(dp[c], v + dp[c - w]);
for (int c = w; c <= W; c++)   // küçükten büyüğe
  dq[c] = Math.max(dq[c], v + dq[c - w]);
System.out.println(dp[W] + " " + dq[W]);
Cevabı göster
10 30
  • Büyükten küçüğe: dp[c − 3] bu turda henüz güncellenmemiştir (eski satır) → eşya en çok bir kez alınır: 10 (0/1).
  • Küçükten büyüğe: dq[3] = 10, dq[6] = 10 + dq[3] = 20, dq[9] = 30 → aynı eşya üç kez alınır: 30 (sınırsız sırt çantası).

Çoktan Seçmeli · 0/1 Sırt Çantası

Soru 13: Sözde-Polinom

0/1 sırt çantası DP'si O(n · W) sürer. Bu süre neden "sözde-polinom" (pseudo-polynomial) olarak adlandırılır?

A: W = 10⁹ yalnızca 30 bitle yazılır ama tablo 10⁹ sütun ister. Süre W'nin büyüklüğüne bağlıdır, uzunluğuna değil; bu yüzden problem NP-zor kalır ve DP yalnızca W küçükken pratiktir.

Adım Adım Çalıştırma · Sınırsız Sırt Çantası

Soru 14: Sınırsız Sırt Çantası İzleme

sinirsizSirtCantasi({2, 3, 4}, {3, 5, 7}, 7) çağrısında dp dizisi nasıl dolar, sonuç nedir?

dp0000000001234567

Eşyalar (w, v): (2, 3), (3, 5), (4, 7); W = 7. dp[c]: c kapasiteyle elde edilebilecek en büyük kâr; her eşyadan istenildiği kadar alınabilir.

dp0000000001234567

c = 1: hiçbir eşya sığmaz → 0.

dp0030000001234567

c = 2: yalnız (3, 2): 3 + dp[0] = 3.

dp0035000001234567

c = 3: max(3 + dp[1] = 3, 5 + dp[0] = 5) = 5.

dp0035700001234567

c = 4: max(3 + dp[2] = 6, 5 + dp[1] = 5, 7 + dp[0] = 7) = 7.

dp0035780001234567

c = 5: max(3 + dp[3] = 8, 5 + dp[2] = 8, 7 + dp[1] = 7) = 8.

dp00357810001234567

c = 6: max(3 + dp[4] = 10, 5 + dp[3] = 10, 7 + dp[2] = 10) = 10.

dp003578101201234567

c = 7: max(3 + dp[5] = 11, 5 + dp[4] = 12, 7 + dp[3] = 12) = 12.

dp003578101201234567

dp[7] = 12: ör. 5 + dp[4] → (3 kg, 5) + (4 kg, 7); ya da (4 kg, 7) + (3 kg, 5). dp[c − w] aynı tur hesaplandığı için eşyalar tekrar kullanılabilir.

static int sinirsizSirtCantasi(int[] w,
                        int[] v, int W) {
  int[] dp = new int[W + 1];  // en iyi kâr
  for (int c = 1; c <= W; c++)
    for (int j = 0; j < w.length; j++)
      if (w[j] <= c)
        dp[c] = Math.max(dp[c],
                    dp[c - w[j]] + v[j]);
  return dp[W];
}

Çıktı Sorusu · Sınırsız Sırt Çantası

Soru 15: Para Üstü

Paralar {1, 5, 6, 9}, tutar 11. En az para sayısını P[x] = 1 + min P[x − c] (c ≤ x), P[0] = 0 bağıntısıyla hesaplayın. "Her adımda en büyük parayı al" diyen açgözlü yöntem kaç para kullanır?

Cevabı göster 01234567891011P012341123122

P[11] = 2 (5 + 6): P[11] = 1 + min(P[10], P[6], P[5], P[2]) = 1 + min(2, 1, 1, 2) = 2.

Açgözlü: 9 + 1 + 1 = 3 para; optimal değildir. O(k · X) zaman (k para türü, X tutar).

Çoktan Seçmeli · Sınırsız Sırt Çantası

Soru 16: Kaç Farklı Yol?

Paralar {2, 3, 5} ile 10 tutarı kaç farklı şekilde ödenebilir? (Sıra önemsiz; dış döngü paralar üzerinde: d[x] += d[x − c].)

D: {5, 5}, {2, 3, 5}, {2, 2, 3, 3}, {2, 2, 2, 2, 2} → 4. Döngüler yer değiştirirse (dış döngü tutar üzerinde) 2 + 3 ile 3 + 2 ayrı sayılır ve sıralı diziler sayılmış olur.

Adım Adım Çalıştırma · Alt Küme Toplamı

Soru 17: altKume Tablosu

altKume({3, 4, 5, 2}, 7) tablosu satır satır nasıl dolar?

dp[i][j]012345670✓·······1 (3)2 (4)3 (5)4 (2)

a = {3, 4, 5, 2}, hedef 7. Sütun 0 hep ✓ (boş küme); satır 0'da diğer toplamlar elde edilemez.

dp[i][j]012345670✓·······1 (3)✓··✓····2 (4)3 (5)4 (2)

i = 1, x = 3: üst satır kopyalanır; dp[i−1][j−3] ✓ olan j'ler de ✓ olur. Yeni toplamlar (mavi): 3.

dp[i][j]012345670✓·······1 (3)✓··✓····2 (4)✓··✓✓··✓3 (5)4 (2)

i = 2, x = 4: üst satır kopyalanır; dp[i−1][j−4] ✓ olan j'ler de ✓ olur. Yeni toplamlar (mavi): 4, 7.

dp[i][j]012345670✓·······1 (3)✓··✓····2 (4)✓··✓✓··✓3 (5)✓··✓✓✓·✓4 (2)

i = 3, x = 5: üst satır kopyalanır; dp[i−1][j−5] ✓ olan j'ler de ✓ olur. Yeni toplamlar (mavi): 5.

dp[i][j]012345670✓·······1 (3)✓··✓····2 (4)✓··✓✓··✓3 (5)✓··✓✓✓·✓4 (2)✓·✓✓✓✓✓✓

i = 4, x = 2: üst satır kopyalanır; dp[i−1][j−2] ✓ olan j'ler de ✓ olur. Yeni toplamlar (mavi): 2, 6.

dp[i][j]012345670✓·······1 (3)✓··✓····2 (4)✓··✓✓··✓3 (5)✓··✓✓✓·✓4 (2)✓·✓✓✓✓✓✓

dp[4][7] = true. Geri okuma: dp[2][7] ✓ ama dp[1][7] · → 4 seçildi (j = 3); dp[1][3] ✓ → 3. Alt küme {3, 4}; {5, 2} de geçerlidir.

boolean altKume(int[] a, int hedef) {
  int n = a.length;
  boolean[][] dp =
      new boolean[n + 1][hedef + 1];
  for (int i = 0; i <= n; i++)
    dp[i][0] = true;           // boş küme
  for (int i = 1; i <= n; i++) {
    int x = a[i - 1];
    for (int j = 1; j <= hedef; j++)
      dp[i][j] = dp[i - 1][j]  // x alınmaz
        || (x <= j && dp[i - 1][j - x]);
  }
  return dp[n][hedef];
}

Çıktı Sorusu · Alt Küme Toplamı

Soru 18: altKume Çıktısı

Dersteki altKume metoduyla kod ne yazdırır? Kısa gerekçe verin.

int[] a = {2, 7, 11, 4};
System.out.println(altKume(a, 13));
System.out.println(altKume(a, 10));
System.out.println(altKume(a, 0));
Cevabı göster
true
false
true
  • 13 = 2 + 11 → true.
  • 10: toplamlar 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24 olabilir; 10 hiçbir alt kümeyle elde edilmez → false.
  • hedef 0: boş küme → dp[n][0] = true (taban durum).

Zaman ve bellek O(n · hedef): sözde-polinom; problem NP-tamdır.

Çoktan Seçmeli · Alt Küme Toplamı

Soru 19: Eşit Bölme

{1, 5, 11, 5} dizisinin toplamı eşit iki parçaya bölünüp bölünemeyeceğini alt küme toplamıyla nasıl buluruz ve sonuç nedir?

C: Toplam S = 22; bir parça S/2 = 11 ederse diğeri de 11 eder. {11} ya da {1, 5, 5} → evet. S tek olsaydı cevap doğrudan hayır olurdu; hedef 22 tüm dizinin kendisini sorar ve bölme hakkında bilgi vermez.

Adım Adım Çalıştırma · En Uzun Artan Alt Dizi

Soru 20: lis İzleme

lis({3, 1, 4, 1, 5, 9, 2, 6}) hangi değeri döndürür?

a3141592601234567dp

dp[i]: a[i]'de biten en uzun artan alt dizinin uzunluğu. Mavi: a[j] < a[i] olan önceki adaylar.

a3141592601234567dp1

i = 0 (a = 3): önünde daha küçük öğe yok → dp[0] = 1.

a3141592601234567dp11

i = 1 (a = 1): önünde daha küçük öğe yok → dp[1] = 1.

a3141592601234567dp112

i = 2 (a = 4): adaylar 3, 1; en büyük dp j = 0 (dp = 1) → dp[2] = 2.

a3141592601234567dp1121

i = 3 (a = 1): önünde daha küçük öğe yok → dp[3] = 1.

a3141592601234567dp11213

i = 4 (a = 5): adaylar 3, 1, 4, 1; en büyük dp j = 2 (dp = 2) → dp[4] = 3.

a3141592601234567dp112134

i = 5 (a = 9): adaylar 3, 1, 4, 1, 5; en büyük dp j = 4 (dp = 3) → dp[5] = 4.

a3141592601234567dp1121342

i = 6 (a = 2): adaylar 1, 1; en büyük dp j = 1 (dp = 1) → dp[6] = 2.

a3141592601234567dp11213424

i = 7 (a = 6): adaylar 3, 1, 4, 1, 5, 2; en büyük dp j = 4 (dp = 3) → dp[7] = 4.

a3141592601234567dp11213424

Sonuç 4 = max dp (ör. 3, 4, 5, 9 ya da 1, 4, 5, 6). dp[n − 1] de 4 ama bu tesadüf; cevap her zaman en büyük dp'dir. O(n²).

static int lis(int[] a) {
  int n = a.length, enUzun = 0;
  int[] dp = new int[n];
  for (int i = 0; i < n; i++) {
    dp[i] = 1;               // tek başına
    for (int j = 0; j < i; j++)
      if (a[j] < a[i] && dp[j] + 1 > dp[i])
        dp[i] = dp[j] + 1;   // uzat
    enUzun = Math.max(enUzun, dp[i]);
  }
  return enUzun;
}

Çıktı Sorusu · En Uzun Artan Alt Dizi

Soru 21: Sonlar Dizisi

Dersteki O(n log n) lisHizli metodu {10, 22, 9, 33, 21, 50, 41, 60} için çalıştırılıyor. Döngü bittiğinde son[0..uz−1] ve dönüş değeri nedir? son bir LIS midir?

Cevabı göster
xson
1010
2210 22
99 22
339 22 33
219 21 33
509 21 33 50
419 21 33 41
609 21 33 41 60

son = [9, 21, 33, 41, 60], uz = 5. Uzunluk doğrudur ama bu dizi bir alt dizi değildir: 21, 33'ten sonra gelir. Gerçek bir LIS: 10, 22, 33, 41, 60. Diziyi kurmak için öncül indisler ayrıca tutulur.

Çoktan Seçmeli · En Uzun Artan Alt Dizi

Soru 22: Cevap Hangi Hücrede?

Bir öğrenci lis metodunda enUzun yerine dp[n - 1] döndürüyor. {5, 1, 6, 2, 7, 0} için hatalı ve doğru sonuçlar nedir?

B: dp = [1, 1, 2, 2, 3, 1]. Son öğe 0 hiçbir diziyi uzatamaz → dp[5] = 1. LIS herhangi bir yerde bitebilir; doğru cevap max dp = 3 (5, 6, 7 ya da 1, 2, 7). 4 uzunluklu artan alt dizi yoktur.

Adım Adım Çalıştırma · Ortak Alt Dizgi

Soru 23: Ortak Alt Dizgi Tablosu

ortakAltDizgi("xabcy", "abcz") tablosu nasıl dolar, sonuç nedir?

L[i][j]εxabcyε000000abcz

Sütunlar X = "xabcy", satırlar Y = "abcz". Satır 0 ve sütun 0 sıfırdır.

L[i][j]εxabcyε000000a001000bcz

Y[0] = 'a' yalnızca X[1] ile eşleşir: L[1][2] = 1; diğer hücreler 0 (bitişiklik bozulur).

L[i][j]εxabcyε000000a001000b000200cz

'b' = X[2]: L[2][3] = L[1][2] + 1 = 2; çapraz devam ediyor.

L[i][j]εxabcyε000000a001000b000200c000030z

'c' = X[3]: L[3][4] = L[2][3] + 1 = 3; enIyi = 3.

L[i][j]εxabcyε000000a001000b000200c000030z000000

'z' hiçbir karakterle eşleşmez: satır tamamen 0. Son hücre L[4][5] = 0 cevap değildir.

L[i][j]εxabcyε000000a001000b000200c000030z000000

Cevap tablonun en büyük değeri: 3. L[3][4]'ten çapraz geriye 3 adım → X[1..3] = "abc".

int ortakAltDizgi(String x, String y) {
  int m = x.length(), n = y.length();
  int enIyi = 0;
  int[][] L = new int[n + 1][m + 1];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      if (y.charAt(i-1) == x.charAt(j-1)) {
        L[i][j] = L[i - 1][j - 1] + 1;
        enIyi = Math.max(enIyi, L[i][j]);
      } else
        L[i][j] = 0;     // bitişiklik biter
  return enIyi;
}

Çıktı Sorusu · Ortak Alt Dizgi

Soru 24: Alt Dizgi ve Alt Dizi

"programlama" ve "gramer" için en uzun ortak alt dizgi (bitişik) ve en uzun ortak alt dizi (LCS) uzunlukları nedir? Ortak alt dizgiyi yazın; tablolardaki cevap hücreleri nerededir?

Cevabı göster
  • En uzun ortak alt dizgi: "gram", uzunluk 4 (programlama'da 3–6, gramer'de 0–3). Cevap tablonun en büyük değeridir.
  • LCS uzunluğu da 4: "gram"dan daha uzun ortak alt dizi yoktur (gramer'in kalan "er"i programlama'da m'den sonra sırayla geçmez). Cevap son hücre L[n][m]'dir.
  • Ortak alt dizgi ≤ LCS her zaman; burada eşittir. "abdca" · "cbda" örneğinde 2 ve 3'tür.

Çoktan Seçmeli · Ortak Alt Dizgi

Soru 25: Tablo Kuralları

En uzun ortak alt dizgi (bitişik) ve en uzun ortak alt dizi (LCS) tablolarının farkı hangi seçenekte doğru verilmiştir?

A: İkisinde de eşleşmede çapraz + 1 yazılır. Alt dizgide bitişiklik bozulunca sayaç 0'a döner ve parça herhangi bir yerde bitebileceği için cevap en büyük değerdir. LCS'de karakter atlanabildiğinden en iyi değer taşınır ve son hücre cevaptır.

Çıktı Sorusu · En Uzun Ortak Alt Dizi

Soru 26: lcs Uzunlukları

Dersteki lcs metodu (uzunluk döndürür) ile kod ne yazdırır? Her biri için bir LCS yazın.

System.out.println(lcs("DINAMIK", "DIAMOND"));
System.out.println(lcs("ABCBDAB", "BDCABA"));
System.out.println(lcs("ABC", ""));
Cevabı göster
4
4
0
  • DINAMIK · DIAMOND: "DIAM" (D, I, A, M sırayla ikisinde de var).
  • ABCBDAB · BDCABA: "BCBA" (ya da "BDAB", "BCAB"); LCS tek değildir, uzunluğu tektir.
  • Boş dizgiyle LCS boştur: L[0][m] = 0.

Zaman ve bellek O(m · n); yalnızca uzunluk gerekiyorsa iki satırla O(min(m, n)) bellek yeter.

Adım Adım Çalıştırma · Diğer Problemler

Soru 27: Kadane İzleme

En büyük toplamlı alt dizi (Kadane, V(i) = max(a[i], V(i−1) + a[i])): kadane({2, -3, 4, -1, -2, 1, 5, -3}) ne döndürür?

a2-34-1-215-301234567V2

V(i): a[i]'de biten en büyük toplamlı alt dizinin toplamı. V(0) = a[0] = 2; enIyi = 2.

a2-34-1-215-301234567V2-1

i = 1: V = max(-3, 2 + -3) = -1 (uzat); enIyi = 2.

a2-34-1-215-301234567V2-14

i = 2: V = max(4, -1 + 4) = 4 (yeniden başla); enIyi = 4.

a2-34-1-215-301234567V2-143

i = 3: V = max(-1, 4 + -1) = 3 (uzat); enIyi = 4.

a2-34-1-215-301234567V2-1431

i = 4: V = max(-2, 3 + -2) = 1 (uzat); enIyi = 4.

a2-34-1-215-301234567V2-14312

i = 5: V = max(1, 1 + 1) = 2 (uzat); enIyi = 4.

a2-34-1-215-301234567V2-143127

i = 6: V = max(5, 2 + 5) = 7 (uzat); enIyi = 7.

a2-34-1-215-301234567V2-1431274

i = 7: V = max(-3, 7 + -3) = 4 (uzat); enIyi = 7.

a2-34-1-215-301234567V2-1431274

Sonuç 7: alt dizi [4, −1, −2, 1, 5] (indis 2–6). Her durum O(1) → O(n) zaman, O(1) bellek.

static int kadane(int[] a) {
  int enIyi = a[0], v = a[0];   // V(0)
  for (int i = 1; i < a.length; i++) {
    v = Math.max(a[i], v + a[i]);  // V(i)
    enIyi = Math.max(enIyi, v);
  }
  return enIyi;
}

Çoktan Seçmeli · Diğer Problemler

Soru 28: Matris Zinciri

Matris zinciri çarpımında M[i][j] = min { M[i][k] + M[k+1][j] + pi−1 · pk · pj : i ≤ k < j }. n matris için zaman karmaşıklığı nedir?

B: O(n²) durum (i ≤ j çiftleri), her durumda k için O(n) seçenek denenir → O(n³). Tüm parantezlemeleri denemek Catalan sayısı kadar, yani üstel sürerdi. Kural yine "durum sayısı × durum başına iş"tir.

Klasik Soru · Diğer Problemler

Soru 29: DP Tasarımı: Para Üstü

Paralar c1, …, ck ve tutar X için "en az kaç para" problemini derste anlatılan adımlarla tasarlayın: durum, bağıntı, taban durum, doldurma sırası, tablo boyutu ve karmaşıklık. Paralar {1, 3, 4} ve X = 6 için tabloyu doldurun.

Cevabı göster
  • Durum: P[x] = x tutarını ödemek için en az para sayısı.
  • Bağıntı: P[x] = 1 + min P[x − c] (c ≤ x); taban: P[0] = 0.
  • Sıra: x = 1, 2, …, X (küçük tutarlar önce hazır olmalı). Tablo: X + 1 hücre.
  • Karmaşıklık: O(k · X) zaman, O(X) bellek (sözde-polinom).
0123456P0121122

P[6] = 1 + min(P[5], P[3], P[2]) = 1 + min(2, 1, 2) = 2 (3 + 3). Açgözlü 4 + 1 + 1 = 3 para verir. Hangi paraların seçildiği, her x için kullanılan c saklanarak geri okunur.

Son

Bölüm 6: Dinamik Programlama: Çalışma Soruları
Konu anlatımı: Dinamik Programlama sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.