我最近遇到了这个问题:“你得到一个布尔表达式,由一串符号'true','false','和','或'和'xor'组成。计算方式的数量将表达式括起来使其计算为true。例如,有两种方法可以将'true和false xor true'括起来,使其计算结果为true。“
我知道这是一个动态编程问题,所以我试着自己想出一个解决方案,如下所示。假设我们有一个表达式为A.B.C ..... D其中'。'表示任何操作,或者,xor和大写字母表示真或假。让我们说这个大小K表达式产生一个真值的方法的数量是N.当一个新的布尔值E被添加到这个表达式时,有两种方法可以将这个新表达式括起来1.((ABC .... D) .E)即。考虑到A.B.C ..... D的所有可能的括号,我们最后添加E. 2.(A.B.C。(D.E))即。首先评估D.E,然后找出大小K表达式可以产生真实的方式的数量。
假设T [K]是大小为K的表达式产生的方式的数量,则T [k] = val1 + val2 + val3,其中val1,val2,val3计算如下。
1)当E与D组合时。
i)它不会改变D的值
ii)它反转了D
的值在第一种情况下val1 = T [K] = N.(因为这减少到最初的A.B.C ...... D表达式)。在第二种情况下,重新评估dp [K],D值反转,即val1。
2)当E与整个表达式分组时。
// val2包含将使用在ABC的所有带括号的实例中给出'true'的表达式生成的'true'的数量...... D i)如果true.E = true则val2 = N
ii)如果为true.E = false则val2 = 0
// val3包含将使用表达式生成的'true'的数量,这些表达式在A.B.C的所有带括号的实例中给出'false'....... D
iii)如果false.E =真则则val3 =(2 ^(K-2) - N)= M ie。表达式大小为K的方式产生的假数[2 ^(K-2)是用括号表示大小为K的表达式的方法数。]
iv)如果false.E = false则val3 = 0
这是我想到的基本想法,但当我检查其解决方案http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swf时,方法完全不同。有人能告诉我我做错了什么,我怎样才能更好地解决DP问题,以便我能够提出类似上面给出的解决方案。
提前致谢。