Kalıp #22
Tek Boyutlu DP
Temeldp[i]'yi net tanımla; sonra daha küçük indekslere bağla.
Ne zaman kullanılır
Önek üzerinde optimal cevap veya yalnızca önceki durumlardan i indeksine varış yolları/min maliyet.
Tanıma ipuçları
- Merdiven çıkma / ev soygunu
- Coin change / word break
- LIS (patience veya O(n²) DP)
Yaygın tuzaklar
- Belirsiz durum tanımı (dp[i] ne demek?)
- Bağımlılıklar için yanlış döngü sırası
- Temel durumlarda off-by-one
90 saniyelik tanıma egzersizi
Hangisi en iyi uyuyor?
- Merdiven çıkma / ev soygunu
- Coin change / word break
- LIS (patience veya O(n²) DP)
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
0
1
2
3
4
5
6
dp[0]=0, else inf
Fewest coins for amount 6 using coins {1,2,5}.
Nasıl düşünülür
dp[i]’yi sade dilde adlandır (i tutarı için min madeni para; i. ev üzerinden maks para). Daha önceki hücrelerle ifade et. Bağımlılıkları saygı gösteren sırada doldur. Yalnızca son birkaç hücre önemliyse alanı sıkıştır.
Şablon şekilleri
| Şekil | Temel hamle | Notlar |
|---|---|---|
| Doğrusal | dp[i] ← dp[i-1], dp[i-2] | Soygun, merdiven |
| Sınırsız knapsack-ish | Coin dış/iç döngü | Coin change |
| LIS tarzı | dp[i]=max j<i | O(n²) temel |
Karmaşıklık temeli
Tipik O(n) veya O(n·W); alan O(n) veya yuvarlanmış O(1).
Şablondan probleme
- dp[i] anlamı + temel durumlar yaz.
- Geçişi yaz.
- Döngü sınırlarını dikkat seç.
- dp[hedef] (veya dp üzerinde max) döndür.
Şablon
TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.
Tek Boyutlu DP · Şablon
/** 1D DP template: Coin Change (fewest coins). dp[x] = min coins for amount x. */
export function coinChange(coins: number[], amount: number): number {
const INF = amount + 1;
const dp = new Array<number>(amount + 1).fill(INF);
dp[0] = 0;
for (let x = 1; x <= amount; x++) {
for (const c of coins) {
if (c <= x) dp[x] = Math.min(dp[x]!, dp[x - c]! + 1);
}
}
return dp[amount]! >= INF ? -1 : dp[amount]!;
}
/** 1D DP template: Coin Change (fewest coins). dp[x] = min coins for amount x. */
export function coinChange(coins: number[], amount: number): number {
const INF = amount + 1;
const dp = new Array<number>(amount + 1).fill(INF);
dp[0] = 0;
for (let x = 1; x <= amount; x++) {
for (const c of coins) {
if (c <= x) dp[x] = Math.min(dp[x]!, dp[x - c]! + 1);
}
}
return dp[amount]! >= INF ? -1 : dp[amount]!;
}
#DurumProblemTürZorlukBitti
- 1#70 Climbing StairsRehbereasy
- 2#139 Word BreakRehbermedium
- 3#198 House RobberRehbermedium
- 4#213 House Robber IIRehbermedium
- 5#300 Longest Increasing SubsequenceRehbermedium
- 6#322 Coin ChangeRehbermedium