【问题标题】:An unparenthesized arithmetic expression不带括号的算术表达式
【发布时间】:2013-05-15 02:46:22
【问题描述】:

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

有人可以帮助我吗?

【问题讨论】:

  • 您在寻找特定的语言吗?您将必须构建一个 for 循环并遍历可能的组合。您将需要一个变量来跟踪最高总和结果。每次迭代,您都将根据跟踪变量检查答案,如果更大则替换它。
  • 伪代码,我相信这是通过动态规划完成的。

标签: algorithm computer-science dynamic-programming


【解决方案1】:

有一个动态规划解决方案。

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

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

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

  1. 首先,您循环遍历表达式,找到每个连续 2 个值的最大值/最小值,并在它们之间使用运算符(嗯,这是一种花哨的说法,只是计算它);
  2. 遍历表达式,找到每个连续 3 个值的最大值/最小值,它们之间有运算符(对于 a ? b ? c,这是通过假设分割点在 ab 之间计算得出的,并且假设分割点在bc上,并存储这两者的最大值/最小值);
  3. 一旦你知道所有k-length 序列的最大值/最小值,使用与步骤 2 中相同的方法计算k + 1-length ,直到 k 是数组的长度,并返回最大值长度为k

这与Matrix Chain Multiplication 算法几乎相同,后者具有O(N^3) 复杂度。复杂度可以通过推理粗略证明:循环N - 1次,每次最多N - 1个子序列,最多尝试N - 1分割点。所以,N ^ 3 时间复杂度。

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2014-07-01
    相关资源
    最近更新 更多