如何更好地解决动态编程问题


9

我最近遇到了一个问题:“您得到一个布尔表达式,由字符串'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)。
彼得·泰勒

好问题!我也必须对DP有所改善。有人说“啊.. DP只是一个简单的递归”。不是!
弗洛伦斯·塞莱

@Florents Tselai看到了您的评论。您为什么认为不是呢?
John Donn 2014年

Answers:


9

与很多事情一样,答案是:

练习,练习,练习。

顺便说一句,我相信在您的解决方案中,您真的在早期就犯了一个小错误,陷入了死胡同:“有两种方法可以用括号括住这个新表达式” –不超过2种吗?怎么样(A.B.(C.D.E)),例如?


“如何更好地做X?” -“做X!” ...听起来合理;-)
Joachim Sauer 2012年

2

我同意occulus的观点,即最需要实践,也想补充一点,您需要注意识别使用DP可以解决的问题的模式(在CLRS中对此进行了很好的解释)

您可以在此处找到涉及动态编程的spoj问题:)


在下投票

该链接不起作用!
deebee 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.