algorithm - 动态规划 : maximize value of arithmetic expression using parenthesis

标签 algorithm dynamic-programming

这是前段时间问我的一个面试问题:

Suppose you are given an expression E= x1 y1 x2 y2....yn-1 xn.

Where Xi belong to natural number and Yi belongs to { +,*}

you need to parenthesize such that it maximize the value of E ?

我能够朝动态规划的方向思考并将其与matrix chain multiplication problem联系起来, 但一直坚持推导这个关系的确切递归关系。

此外,后续问题让我的情况变得更加复杂:

Let's change Yi to { +,-,*,/}, then how to maximize E? Now add % operator in that set..then how to maximize E?

关于如何处理和构建解决方案的解释会很棒。

最佳答案

我认为与矩阵乘法算法的相同关系会起作用。

我们要计算的函数是

F(i,j) = maximum number that can be computed using Xi ... Xj

基本情况是当我们有一个数字时:

F(i,i) = Xi

递归的情况是在括号中包含的两个子表达式之间的操作:

F(i,j) = for k = i,j-1, maximize
    F(i,k) Yk F(k+1, j)

我认为贪婪地最大化数字应该可行,因为对于正数的乘法和加法,我们希望两个操作数都尽可能大。

如果我们允许除法,那么我们将希望第二个操作数尽可能小以使结果最大化。在这种情况下,您不仅需要计算 F,还需要计算类似的 G 以最小化区间内的值。

如果我们允许减法,那么我们将需要考虑正数和负数d。如果您跟踪最大正数、最小正数、最大负数和最小负数,我认为您应该能够获得所需的任何值。也许有一种替代方案需要更少的计算。

我没有停下来思考 % 的含义。对于初学者,它如何处理来自 / 的非整数结果?

关于algorithm - 动态规划 : maximize value of arithmetic expression using parenthesis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24744491/

相关文章:

algorithm - 从其前序和后序列表中重建一棵树

algorithm - 从给定长度的数组中排列整数

algorithm - 计算走 1、2 或 3 步后爬 n 步的方法

algorithm - 当最多可以省略 k 个元素时,查找最大和连续子数组?

c - 动态规划 - C 中的最小硬币数

c - 如何实现背包算法,其中数组的索引代表元素的重量

java - Java中某些数字的排列

java - 如何证明没有区间重叠?

python - 尝试在固定长度的多行上打印单个字符串并最小化成本

python - 如何在python上获取周数?