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