我遇到了以下练习题。
您可以随意将任何括号放在表达式中,也可以根据需要添加任何括号。但是,在放入括号后,它应该是一个有效的表达式。问题是你可以制作多少个不同的数字?防爆。对于1 - 2 + 3 - 4 - 5
,您可以获得以下六个唯一值:
1 - 2 + 3 - 4 - 5 = -7
1 - (2 + 3) - 4 - 5 = -13
1 - (2 + 3 - 4) - 5 = -5
1 - (2 + 3 - 4 - 5) = 5
1 - 2 + 3 - (4 - 5) = 3
1 - (2 + 3) - (4 - 5) = -3
我似乎无法弄清楚如何针对这个问题制定动态规划方案。我刚开始解决涉及动态规划的问题,似乎无法弄清楚如何解决这个问题。
编辑数字范围为0 <= N <= 100且表达长度(&lt; = 30)
答案 0 :(得分:1)
括号基本上介于数字和运算符之间,任何不平衡都可以固定在整个表达式的末尾。
(在任一运算符之前立即是非法语法。
(在 + 之后立即合法但毫无意义,因为它不会改变评估顺序。我假设我们不这样做。
(紧接 - 之后是合法且重要的。
紧接 + 之前的)是合法且重要的 iff 之前有匹配的(。< / p> 紧接在 - 之前的
是合法但无意义的,因为在以下数字之后打开一对新的括号会给出相同的符号更改以及稍后的更多选项,因为我们将有一个更开放的对,我们可以关闭。我假设我们也不这样做。
这意味着我们实际需要的唯一括号是在负数之前打开括号,在正数之后打开括号。如果我们坚持这两个,那么下一个数字乘以总和的符号仅取决于开括号的数是偶数还是奇数。
这给了我们
从左到右解析状态,在每个数字之后,当前子问题可以表示为一对
(1,0)
也就是说,这个子问题只有一个解决方案:到目前为止的部分和是1,开括号的数量是0.从现在开始,在每个子问题中我都有一行用于这对子问题来自前一个子问题的每一对。
( - 1,1),(-1,0)
即。部分和为-1,但我们可能会也可能没有插入左括号。
( - 4,1),( - 4,0)
(2,0)
这个子问题的新内容:我们可以选择关闭一对括号,但只有当一个括号打开时才会这样。
(0,2),(0,1)
( - 8,0),( - 8,1)
( - 2,0),( - 2,1)
( - 5,2),( - 5,3)
(5,1),(5,2)
( - 13,0),( - 13,1)
( - 3,1),( - 3,2)
( - 7,0),( - 7,1)
(3,1),(3,2)
最后,我们通过仅查看每对中的第一个元素并丢弃重复项来获得可能的总和。