私は最近この質問に出くわしました。「シンボルの文字列で構成されるブール式が与えられます。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
)。