web-dev-qa-db-ja.com

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

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

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

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

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

i)Dの値を変更しない

ii)Dの値を逆にします

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

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

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

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

// val3には、括弧で囲まれたA.B.C ....... 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をよりよく解決するにはどうすればよいですか?.

前もって感謝します。

9
newbie

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

練習、練習、練習。

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

9
occulus

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

動的プログラミングに関連するspoj問題を見つけることができます here :)

2
nischayn22