Bölüm 6: Dinamik Programlama
Ç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?
bellek dizisi 0 ile başlar (0 = "henüz hesaplanmadı"). fib(4) tabloda yok → fib(3) çağrılır.
fib(3) tabloda yok → fib(2) çağrılır.
fib(2) tabloda yok → fib(1) çağrılır.
fib(1): taban durum, 1 döner.
fib(2)'de a = 1; şimdi fib(0) çağrılır: taban durum, 0 döner.
bellek[2] = 1 + 0 = 1 yazılır ve döndürülür.
fib(3)'te a = 1; fib(1) çağrılır → 1 (taban).
bellek[3] = 1 + 1 = 2.
fib(4)'te a = 2; fib(2) çağrılır: bellek[2] = 1 hazır, hiç alt çağrı yapılmadan döner.
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?
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.
i = 1 (3, 2): c ≥ 2 için al → K = 3; c < 2 sığmaz.
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).
i = 3 (5, 4): c = 4: max(4, 5 + 0) = 5; c = 5: max(7, 5 + K[2][1] = 5) = 7 (alma).
i = 4 (6, 5): c = 5: max(7, 6 + K[3][0] = 6) = 7 (alma). Satır öncekiyle aynı kalır.
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
| i | K[i][0..10] |
|---|---|
| 1 | 0 0 0 0 0 10 10 10 10 10 10 |
| 2 | 0 0 0 0 40 40 40 40 40 50 50 |
| 3 | 0 0 0 0 40 40 40 40 40 50 70 |
| 4 | 0 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?
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.
c = 1: hiçbir eşya sığmaz → 0.
c = 2: yalnız (3, 2): 3 + dp[0] = 3.
c = 3: max(3 + dp[1] = 3, 5 + dp[0] = 5) = 5.
c = 4: max(3 + dp[2] = 6, 5 + dp[1] = 5, 7 + dp[0] = 7) = 7.
c = 5: max(3 + dp[3] = 8, 5 + dp[2] = 8, 7 + dp[1] = 7) = 8.
c = 6: max(3 + dp[4] = 10, 5 + dp[3] = 10, 7 + dp[2] = 10) = 10.
c = 7: max(3 + dp[5] = 11, 5 + dp[4] = 12, 7 + dp[3] = 12) = 12.
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
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?
a = {3, 4, 5, 2}, hedef 7. Sütun 0 hep ✓ (boş küme); satır 0'da diğer toplamlar elde edilemez.
i = 1, x = 3: üst satır kopyalanır; dp[i−1][j−3] ✓ olan j'ler de ✓ olur. Yeni toplamlar (mavi): 3.
i = 2, x = 4: üst satır kopyalanır; dp[i−1][j−4] ✓ olan j'ler de ✓ olur. Yeni toplamlar (mavi): 4, 7.
i = 3, x = 5: üst satır kopyalanır; dp[i−1][j−5] ✓ olan j'ler de ✓ olur. Yeni toplamlar (mavi): 5.
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[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?
dp[i]: a[i]'de biten en uzun artan alt dizinin uzunluğu. Mavi: a[j] < a[i] olan önceki adaylar.
i = 0 (a = 3): önünde daha küçük öğe yok → dp[0] = 1.
i = 1 (a = 1): önünde daha küçük öğe yok → dp[1] = 1.
i = 2 (a = 4): adaylar 3, 1; en büyük dp j = 0 (dp = 1) → dp[2] = 2.
i = 3 (a = 1): önünde daha küçük öğe yok → dp[3] = 1.
i = 4 (a = 5): adaylar 3, 1, 4, 1; en büyük dp j = 2 (dp = 2) → dp[4] = 3.
i = 5 (a = 9): adaylar 3, 1, 4, 1, 5; en büyük dp j = 4 (dp = 3) → dp[5] = 4.
i = 6 (a = 2): adaylar 1, 1; en büyük dp j = 1 (dp = 1) → dp[6] = 2.
i = 7 (a = 6): adaylar 3, 1, 4, 1, 5, 2; en büyük dp j = 4 (dp = 3) → dp[7] = 4.
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
| x | son |
|---|---|
| 10 | 10 |
| 22 | 10 22 |
| 9 | 9 22 |
| 33 | 9 22 33 |
| 21 | 9 21 33 |
| 50 | 9 21 33 50 |
| 41 | 9 21 33 41 |
| 60 | 9 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?
Sütunlar X = "xabcy", satırlar Y = "abcz". Satır 0 ve sütun 0 sıfırdır.
Y[0] = 'a' yalnızca X[1] ile eşleşir: L[1][2] = 1; diğer hücreler 0 (bitişiklik bozulur).
'b' = X[2]: L[2][3] = L[1][2] + 1 = 2; çapraz devam ediyor.
'c' = X[3]: L[3][4] = L[2][3] + 1 = 3; enIyi = 3.
'z' hiçbir karakterle eşleşmez: satır tamamen 0. Son hücre L[4][5] = 0 cevap değildir.
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?
V(i): a[i]'de biten en büyük toplamlı alt dizinin toplamı. V(0) = a[0] = 2; enIyi = 2.
i = 1: V = max(-3, 2 + -3) = -1 (uzat); enIyi = 2.
i = 2: V = max(4, -1 + 4) = 4 (yeniden başla); enIyi = 4.
i = 3: V = max(-1, 4 + -1) = 3 (uzat); enIyi = 4.
i = 4: V = max(-2, 3 + -2) = 1 (uzat); enIyi = 4.
i = 5: V = max(1, 1 + 1) = 2 (uzat); enIyi = 4.
i = 6: V = max(5, 2 + 5) = 7 (uzat); enIyi = 7.
i = 7: V = max(-3, 7 + -3) = 4 (uzat); enIyi = 7.
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).
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.