Dinamik Programlama için Alt Sorunlara Karar Verme


39

Dinamik programlama tekniğini defalarca kullandım ancak bugün bir arkadaşım alt sorunlarımı nasıl tanımlayacağımı sordu, nesnel bir resmi cevap vermenin hiçbir yolu olmadığını fark ettim. Dinamik programlama kullanarak çözeceğiniz bir problem için bir alt problemi resmi olarak nasıl tanımlarsınız?


Mevcut cevapların hiçbiri (Nisan 2019 itibariyle) özellikle yeni başlayanlar için yeterince iyi görünmüyor. Diğer sitelerde öğreticiler tavsiye ederim.
Apass.Jack

Yanıtlar:


35

Dinamik programlama prensibi yukarıdan aşağıya düşünmeyi (yani özyinelemeli), aşağıdan yukarıya çözmeyi gerektirir. Bu yüzden bir DP'nin tasarlanması için iyi bir strateji, problemi özyinelemeli olarak formüle etmek ve alt problemleri bu şekilde oluşturmaktır.


14
Bunun tek strateji olduğunu iddia ediyorum .
JeffE

2
@JeffE Evet, algoritma derslerimi öğretirken notlarınızı okudum ve kullandım ve etkili oldu. Alıntı: "Dinamik tablo doldurmakla ilgili değil. Akıllı özyinelemeyle ilgili!"
Dai

2
DP'lerin nasıl öğretileceği konusundaki anlayışım @ JeffE'in notlarından GÜÇLENDİRİLMİŞTİR :)
Suresh

3
Yukarıdan aşağıya özyinelemeli prosedürü otomatik olarak dinamik bir programlama algoritmasına dönüştürmek de mümkündür. Geri dönmek üzereyken, cevabı bir karma tabloda saklayın. Her aramanın başlangıcında, cevabın zaten karma tablosunda olup olmadığını kontrol edin ve öyleyse hemen geri gönderin. Pek çok algoritma bu fikirle kolaylaşıyor. Örneğin, böyle bir tabloyla, özyinelemeli algoritmalar denemeler otomatik olarak DAWG'lerde çalışır. Bir çağrının başlangıcındaki tablodaki sentinel değerini saklayarak, aynı algoritmalar DFA'larda bile çalışabilir. BDD'lerdeki algoritmalar özyinelemeyle belirtmek çok kolaylaşır.
Jules

1
Son fakat en az değil, bu büyük performans avantajları olabilir. Örneğin, geleneksel aşağıdan yukarıya doğru olan alt toplamı algoritması, gereksiz tablo girişlerini tonlarca hesaplayabilir. Bu yöntemle sadece gerekli tablo girişleri hesaplanacaktır.
Jules

4

@Suresh'in belirttiği gibi, probleminizin DP tarafından çözülebileceğini bildiğiniz zaman (yani, optimal altyapı ve örtüşen alt problemler sergiliyor), bir bölmeyi düşünebilir ve özyinelemeli bir çözüm elde edebilirsiniz.

O(1)

Bu nedenle, bir bölme ve fethetme çözümünü düşünmek, kendi probleminiz için bir alt problemin ne olabileceği konusunda fikir verecektir.


1
"optimum altyapı" (bu ne anlama gelirse) DP çözülebilirliği için muhtemelen yeterli bir koşul değildir. "Örtüşen alt problemler" kesinlikle gerekli değildir.
Raphael

1
Optimal altyapı ve örtüşen üst sorunların her ikisi de DP tarafından etkin bir şekilde çözülebilen problemlerle ortaya çıkıyor. Elbette tek başına optimal altyapı DP çözülebilirliği için yeterli değildir. Bununla birlikte, üst üste binen alt sorunlarınız yoksa, sorunu sıradan bölünerek çözebilir ve aynı maliyetle yenebilirsiniz: gerçekten, DP'nin bölmeye göre avantajı, her alt problemin özyineleme ağacında karşılaşıldığında tam olarak bir kez çözülmesidir. .
Massimo Cafaro

1
Bu benim formülasyonum değil: Cormen, Leiserson, Rivest ve Stein'ın “algoritmalara giriş” ve algoritmalar hakkındaki diğer pek çok kitapta bulabilirsiniz.
Massimo Cafaro

1
Jüp ve çoğu en azından kısmen yanlıştır. Uygun bir soru gönderirseniz ayrıntılı bir şekilde hazırlanmaktan mutluluk duyarım.
Raphael

1
Son yorumunuzu doğru anladığımdan emin değilim. Bu tür bir karakterizasyonun yanlış olduğunu göstermek için (kısmen yanlış olamaz: ya doğru ya da yanlış), basit bir örnek olarak gösterebilirsiniz, hem optimal altyapıyı hem de üst üste gelen alt sorunları göstermeyen bir problem. polinom DP çözeltisine uygun. Ancak, bu bağlamda, bunun sıradan bölünme ve fethetmeden daha iyi olduğu bir çözüm anlamına geldiğine dikkat edin.
Massimo Cafaro

2

Tecrübelerim, "zaten sayılan yararlı değeri saklama yardımı ile gereksiz sayımı azaltmanın" bir yolunu bulmak. Bu arada, Dinamik Programlama, ICPC'de çok popülerdir (International Collegiate Programming Contest.) Herkes, birkaç ICPC problemini uyguladıktan sonra DP hakkında kendi hislerine sahip olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.