Kalıp #23
İki Boyutlu DP
TemelDurum 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
- dp[i][j]’yi kelimelerle tanımla.
- İlk satır/sütunu başlat.
- Yinelemenin geometrik komşularından geçiş.
- 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ürZorlukBitti
- 1#62 Unique PathsRehbermedium
- 2#63 Unique Paths IIRehbermedium
- 3#64 Minimum Path SumRehbermedium
- 4#72 Edit DistanceRehbermedium
- 5#221 Maximal SquareRehbermedium
- 6#1143 Longest Common SubsequenceRehbermedium