算术表达式可以有许多可能的值
有人能帮助我吗?
答案 0 :(得分:2)
有一个动态编程解决方案。
对于表达式,您可以将其“最外面的分割点”定义为不在任何括号内的第一个运算符。现在在分割后,如果它在+
上,那么你需要最大化左子表达式和右子表达式;如果是-
,则最大化左侧并最小化右侧。
您可以使用动态编程或memoization来实现此算法。记忆很简单:搜索每个分割点,并将答案保存在另一个数据结构中(两个2D矩阵,M[x][y]
字符串表达式的最大/最小值,从x
开始到{{}结束1}});当数据在矩阵中时,使用它而不是重新计算。
使用动态编程有点棘手,但你可以这样想:
y
,这是通过假设分割点在a ? b ? c
和{{1之间]来计算的假设分割点在a
和b
上,并存储这两个的最大/最小值); b
- 长度序列的最大值/分钟后,使用与步骤2中相同的方法计算c
- 长度序列,直到k为数组的长度,并且返回长度k
的最大值。这与Matrix Chain Multiplication算法几乎相同,后者具有k + 1
复杂度。可以通过推理粗略地证明复杂性:您需要循环k
次,每次最多O(N^3)
个子序列,并且您需要尝试最多N - 1
个分裂点。所以,N - 1
时间复杂度。