我最近遇到了一个问题:“您得到一个布尔表达式,由字符串'true','false','and','or'和'xor'组成。计算括号的方法数量这样,表达式的结果将为true。例如,可以通过两种方式将“ true and false xor true”括起来,使其结果为true。”
我知道这是一个动态编程问题,因此我尝试自己提出一个解决方案,如下所示。假设我们有一个表达式为ABC .... D,其中“。” 代表任何运算,或xor和大写字母代表true或false。可以说,此大小为K的表达式产生真值的方式为N。当向该表达式添加新的布尔值E时,有两种方法可以使该新表达式成为括号。(((ABC .... D) .E),即 加上ABC .... D的所有可能括号,我们在末尾加上E。2.(ABC(DE)),即 首先评估DE,然后找到此大小为K的表达式产生真值的方式。
假设T [K]是大小为K的表达式产生真值的方式数,则T [k] = val1 + val2 + val3其中val1,val2,val3的计算如下。
1)当E与D分组时
i)它不会改变D的值
ii)反转D的值
在第一种情况下,val1 = T [K] = N。(因为这简化为初始ABC ... D表达式)。在第二种情况下,重新计算dp [K],其中D的值取反,即val1。
2)当E与整个表达式分组时。
// val2包含'true'的数量E将产生的表达式在所有带括号的ABC实例中给出'true'... D i)如果为true.E = true则val2 = N
ii)如果为true.E = false,则val2 = 0
// val3包含E将产生的'true'数,并且在所有带括号的ABC实例中给出'false'
iii)如果false.E = true,则val3 =(2 ^(K-2)-N)= M即。大小为K的表达式产生错误的方式数[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
)。