我在编程比赛中遇到了这个问题:
给出表达式x1 op x2 op x3 op。 。 。 op xn,其中op是要么添加' +'或乘法' *'和xi是1到9之间的数字。目标是在表达式中只插入一组括号,以便最大化表达式的结果。
n最大为2500.
例如: 输入: 3 + 5×7 + 8 * 4
输出: 303
说明: 3 + 5 *(7 + 8)* 4
在问题中给出了另一个限制,即最多只有15' *'标志将出现。这简化了问题。因为我们将只有17个支架插入选项,而暴力可以在O(17 * n)中工作。
我一直在想如果这个约束不存在,那么理论上我能解决O(n ^ 2)中的问题吗?在我看来,DP问题。我在理论上说,因为答案会很大(9 ^ 2500可能)。因此,如果我忽略使用大数字的时间复杂度,那么O(n ^ 2)可能吗?
答案 0 :(得分:1)
如果没有乘法,你就完成了。
如果没有添加,则表示您已完成。
必须进行评估的子项的前导和尾随操作总是添加,因为乘法周围的括号不会改变结果。
如果您的子项只有添加项,则无需评估它们的子部分。完整子项的乘法将总是更大。 (因为我们只有正数/数字。)
遍历该术语一次,尝试将每个*后面的左括号(最坏情况)置于+,并在该循环内第二次,尝试在每个成功之前放置右括号(最坏情况)*紧随其后的是+。
你可以用O(ma / 2)解决问题,m:乘法次数和a:加法次数。这小于n ^ 2.
用^:
显示括号的可能位置1*2*^3+4+5^*6*^7+8^