Dinamik programlama problemlerini çözmede nasıl daha iyi olunur


9

Kısa süre önce bu soruya rastladım: "Size 'true', 'false', 've', 'veya' ve 'xor' sembollerinden oluşan bir boole ifadesi verilir. Örneğin, "true ve false xor true" ifadesini true olarak değerlendirecek şekilde parantez haline getirmenin iki yolu vardır. "

Dinamik bir programlama problemi olduğunu biliyordum, bu yüzden aşağıdaki gibi kendi başıma bir çözüm bulmaya çalıştım. Diyelim ki ABC .... D diye bir ifademiz var, burada '.' , herhangi bir işlemi temsil eder ve veya, xor ve büyük harfler doğru veya yanlış temsil eder. Diyelim ki, K boyutundaki bu ifadenin doğru üretmenin yol sayısı N'dir. Bu ifadeye yeni bir boole değeri E eklendiğinde, bu yeni ifadeyi 1 parantez içine almanın 2 yolu vardır. ((ABC .... D) .E) yani. ABC'nin tüm olası parantezleri ile .... D sonunda E ekliyoruz. 2. (ABC (DE)) yani. önce DE'yi değerlendirin ve sonra bu K boyutu ifadesinin gerçek üretme yollarının sayısını bulun.

varsayalım ki T [K], K boyutuna sahip ifadenin doğru üretme yollarının sayısıdır, o zaman T [k] = val1 + val2 + val3, burada val1, val2, val3 aşağıdaki gibi hesaplanır.

1) E, D ile gruplandığında.

i) D'nin değerini değiştirmez

ii) D'nin değerini tersine çevirir

ilk durumda val1 = T [K] = N. (Bu, ilk ABC ... D ifadesine düştüğü için). İkinci durumda dp [K] değerini D değeri ters çevrilmiş ve val1 olarak yeniden değerlendirin.

2) E, bütün ifadeyle gruplandırıldığında.

// val2, ABC'nin parantez içindeki tüm örnekleri arasında 'true' veren ifadelerle üretilecek 'true' sayısını içerir ...... D i) true ise. E = true sonra val2 = N

ii) doğruysa E = yanlış sonra val2 = 0

// val3, ABC'nin tüm parantez içindeki örnekleri arasında 'false' veren ifadelerle üretilecek 'true' sayısını içerir ...... D

iii) yanlış.E = doğru ise val3 = (2 ^ (K-2) -N) = M yani. K boyutundaki ifadenin yanlış üretme yollarının sayısı [2 ^ (K-2), K boyutundaki bir ifadeyi parantez içine almanın yol sayısıdır.

iv) false olursa.E = false olursa val3 = 0

Aklımda olan temel fikir budur ama çözümünü kontrol ettiğimde http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swf yaklaşım tamamen farklıydı. Birisi bana neyi yanlış yaptığımı ve DP'yi çözmede nasıl daha iyi olabileceğimi söyleyebilir, böylece kendimde verilen gibi çözümler bulabilirim.

Şimdiden teşekkürler.


Soru yanlış. true and (false xor true) = (true and false) xor true(her ikisini de azaltarak kolayca görülebilir false xor true).
Peter Taylor

Harika bir soru! Ben de DP için daha iyi almak zorunda. Bazıları "ah .. DP sadece basit bir özyineleme ile ilgilidir" der. Değil!
Florents Tselai

@ Florent Tselai sadece yorumunu gördü. Neden olmadığını düşünüyorsun?
John Donn

Yanıtlar:


9

Cevap, birçok şeyde olduğu gibi:

Uygulama, uygulama, uygulama.

Bu arada, çözümünüzde gerçekten erken bir önemsiz hata yaparak çıkmaz bir noktaya geldiğinize inanıyorum: "Bu yeni ifadeyi parantez haline getirmenin 2 yolu var" - 2'den fazla yok mu? (A.B.(C.D.E))Mesela ne dersin ?


"X yaparken nasıl daha iyi olabilirim?" - "X Yap!" ... makul geliyor ;-)
Joachim Sauer

2

Uygulamanın en çok gerekli olduğuna dair okula katılıyorum, ayrıca DP kullanarak çözülebilecek problemlerdeki kalıpları tanımak için dikkat etmeniz gerektiğini de eklemek istiyorum (bu CLRS'de oldukça iyi açıklanmıştır)

Dinamik programlamayı içeren spoj sorunlarını burada bulabilirsiniz :)


geliştirmek için downvote önce yorum lütfen :)
nischayn22

bu bağlantı çalışmıyor!
deebee
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.