動的プログラミングの問題を解決する方法


9

私は最近この質問に出くわしました。「シンボルの文字列で構成されるブール式が与えられます。true、false、and、or、xor。括弧で囲む方法の数を数えますtrueと評価されるような式。たとえば、trueと評価されるように 'trueとfalse xor true'を括弧で囲むには2つの方法があります。

私はそれが動的プログラミングの問題であることを知っていたので、次のような自分で解決策を考え出そうとしました。ABC .... D where '。'のような式があるとします。操作のいずれかを表します。または、xorおよび大文字はtrueまたはfalseを表します。このサイズKの式がtrueを生成する方法の数はNであるとしましょう。新しいブール値Eがこの式に追加されると、この新しい式1を括弧で囲む2つの方法があります((ABC .... D) .E)つまり ABC .... Dの可能なすべての括弧で、最後にEを追加します。2.(ABC(DE))すなわち まずDEを評価してから、サイズKのこの式が真を生成する方法の数を見つけます。

T [K]がサイズKの式がtrueを生成する方法の数であるとすると、T [k] = val1 + val2 + val3で、val1、val2、val3は次のように計算されます。

1)EがDとグループ化されている場合。

i)Dの値を変更しない

ii)Dの値を逆にします

最初のケースではval1 = T [K] = Nです(これは最初のABC ... D式に減少するため)。2番目のケースでは、Dの値を逆にしてdp [K]を再評価します。これはval1です。

2)Eが式全体とグループ化されている場合。

// val2には、「true」の数が含まれます。Eは、括弧で囲まれたABCのすべてのインスタンスの中で「true」を与えた式で生成されます...... D i)true.E = trueの場合、val2 = N

ii)true.E = falseの場合、val2 = 0

// val3には、ABC ...... Dの括弧で囲まれたすべてのインスタンス間で「false」を与えた式で生成される「true」の数が含まれます。

iii)false.E = trueの場合、val3 =(2 ^(K-2)-N)= Mすなわち サイズKの式がfalseを生成する方法の数[2 ^(K-2)はサイズKの式を括弧で囲む方法の数]

iv)false.E = falseの場合、val3 = 0

これは私が考えていた基本的な考え方ですが、その解決策をhttp://people.csail.mit.edu/bdean/6.046/dp/dp_9.swfで確認したところ、アプローチは完全に異なりました。誰かが私が間違っていることを教えてもらえますか、自分で上記のような解決策を考え出すことができるように、DPを解決するのにどのようにして上手くいけますか?

前もって感謝します。


質問は間違っています。true and (false xor true) = (true and false) xor true(両方をに減らすと簡単にわかりますfalse xor true)。
Peter Taylor

すばらしい質問です。私もDPに良くならなければなりません。「ああ.. DPは単純な再帰について」と言う人もいます。そうではありません!
Florents Tselai

@Florents Tselaiはあなたのコメントを見ました。なぜそうではないと思いますか?
John Donn 2014年

回答:


9

多くの場合と同様に、答えは次のとおりです。

練習、練習、練習。

ところで、あなたの解決策では、「この新しい式を括弧で囲むには2つの方法があります」という些細な間違いを犯して行き詰まりに陥ったと思います。2つ以上はありませんか?(A.B.(C.D.E))たとえば、どうですか?


「どうすればXを上手にできるようになりますか?」-「ドX!」...合理的に聞こえます;-)
Joachim Sauer

2

練習が最も必要であるというオクルスに同意します。また、DPを使用して解決できる問題のパターンを認識する際に注意を払う必要があることも付け加えます(これはCLRSでかなりよく説明されています)。

あなたはここで動的プログラミングを含むspoj問題を見つけることができます:)


改善するために、反対票を投じる前にコメントしてください:)
nischayn22

そのリンクは機能しません!
ディービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.