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

Kalıp #22

Tek Boyutlu DP

Temel

dp[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

  1. dp[i] anlamı + temel durumlar yaz.
  2. Geçişi yaz.
  3. Döngü sınırlarını dikkat seç.
  4. 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ürBitti
  1. 1#70 Climbing StairsRehber
  2. 2#139 Word BreakRehber
  3. 3#198 House RobberRehber
  4. 4#213 House Robber IIRehber
  5. 5#300 Longest Increasing SubsequenceRehber
  6. 6#322 Coin ChangeRehber