İçeriğe atla
ΣDSA Patterns
Menü
Dil

Kalıp #23

İki Boyutlu DP

Temel

Durum iki değişen indekse bağlı (ızgara, iki string, DP'de iki işaretçi).

Ne zaman kullanılır

Izgarada yollar, edit distance, LCS veya i ve j parametreli herhangi bir yineleme.

Tanıma ipuçları

  • Benzersiz yollar / min yol toplamı
  • Edit distance / LCS
  • dp[i][j] komşulardan

Yaygın tuzaklar

  • Yanlış ilk satır/sütun başlatma
  • Doldurulmamış hücreleri okuyan döngü sırası
  • Dahil uzunluklar vs indeksleri karıştırmak

90 saniyelik tanıma egzersizi

Hangisi en iyi uyuyor?

  • Benzersiz yollar / min yol toplamı
  • Edit distance / LCS
  • dp[i][j] komşulardan

Interactive

Zihinsel model

Değişmezin tam adım adım anlatımı. Duraklat, noktalara tıkla veya ← → kullan. Her adımı kendi cümlelerinle anlatmayı hedefle.

Adım 1 / 8
1
1
1
1
?
?
1
?
?

dp[r][c]=up+left

Unique paths on a 3x3 grid. Borders are 1.

Nasıl düşünülür

dp[i][j] = i ve j öneki (veya hücre (i,j)) alt probleminin cevabı. Artan i+j veya satır tarayarak doldur. Cevap genelde dp[m][n] veya dp[m-1][n-1]’de.

Şablon şekilleri

Şekil Temel hamle Notlar
Izgara yolları üst/soldan Engeller sıfırlar
String DP eşleşme → diag+1 yoksa skip min/max
Yuvarlanan dizi Yalnızca önceki satır Alan tasarrufu

Karmaşıklık temeli

O(m·n) zaman ve alan (veya yuvarlanan ile O(min(m,n)) alan).

Şablondan probleme

  1. dp[i][j]’yi kelimelerle tanımla.
  2. İlk satır/sütunu başlat.
  3. Yinelemenin geometrik komşularından geçiş.
  4. Köşe hücreyi döndür.

Şablon

TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.

İki Boyutlu DP · Şablon
/** 2D DP template: unique paths (right/down only). dp[c] rolled per row. */
export function uniquePaths(m: number, n: number): number {
  const dp = new Array<number>(n).fill(1);
  for (let r = 1; r < m; r++) {
    for (let c = 1; c < n; c++) dp[c] = dp[c]! + dp[c - 1]!;
  }
  return dp[n - 1]!;
}
/** 2D DP template: unique paths (right/down only). dp[c] rolled per row. */
export function uniquePaths(m: number, n: number): number {
  const dp = new Array<number>(n).fill(1);
  for (let r = 1; r < m; r++) {
    for (let c = 1; c < n; c++) dp[c] = dp[c]! + dp[c - 1]!;
  }
  return dp[n - 1]!;
}
#DurumProblemTürBitti
  1. 1#62 Unique PathsRehber
  2. 2#63 Unique Paths IIRehber
  3. 3#64 Minimum Path SumRehber
  4. 4#72 Edit DistanceRehber
  5. 5#221 Maximal SquareRehber
  6. 6#1143 Longest Common SubsequenceRehber