一个不明确的算术表达式

时间:2013-05-15 02:46:23

标签: algorithm computer-science dynamic-programming

算术表达式可以有许多可能的值

有人能帮助我吗?

1 个答案:

答案 0 :(得分:2)

有一个动态编程解决方案。

对于表达式,您可以将其“最外面的分割点”定义为不在任何括号内的第一个运算符。现在在分割后,如果它在+上,那么你需要最大化左子表达式和右子表达式;如果是-,则最大化左侧并最小化右侧。

您可以使用动态编程或memoization来实现此算法。记忆很简单:搜索每个分割点,并将答案保存在另一个数据结构中(两个2D矩阵,M[x][y]字符串表达式的最大/最小值,从x开始到{{}结束1}});当数据在矩阵中时,使用它而不是重新计算。

使用动态编程有点棘手,但你可以这样想:

  1. 首先,循环遍历表达式,找到每个连续2个值的最大值/最小值,并在它们之间使用运算符(好吧,这是说计算它的奇特方式);
  2. 循环遍历表达式,找到每个连续3个值的最大值/最小值,使用它们之间的运算符(对于y,这是通过假设分割点在a ? b ? c和{{1之间]来计算的假设分割点在ab上,并存储这两个的最大/最小值);
  3. 知道所有b - 长度序列的最大值/分钟后,使用与步骤2中相同的方法计算c - 长度序列,直到k为数组的长度,并且返回长度k的最大值。
  4. 这与Matrix Chain Multiplication算法几乎相同,后者具有k + 1复杂度。可以通过推理粗略地证明复杂性:您需要循环k次,每次最多O(N^3)个子序列,并且您需要尝试最多N - 1个分裂点。所以,N - 1时间复杂度。