http://bookshadow.com/weblog/2017/04/16/leetcode-optimal-division/
题目大意:
给定一组正整数,相邻整数之间使用除号连接。例如,[2,3,4] -> 2 / 3 / 4
在其中加入括号可以改变运算顺序,求运算结果最大时的加括号方案,返回表达式。
注意:
- 输入整数长度范围[1, 10]
- 元素范围[2, 1000]
- 输入确保有唯一解
解题思路:
解法I 数学
在不添加任何括号的情况下:
在算式中添加括号会使得被除数和除数的构成发生变化
但无论括号的位置如何,a一定是被除数的一部分,b一定是除数的一部分
原式添加括号方案的最大值,等价于求除数的最小值
因此最优添加括号方案为:
Python代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
解法II 穷举法
递归枚举分割点,将nums分成左右两半
当右半部分的长度大于1时,为右半部分加括号
def solve(snums):
if len(snums) == 1: yield snums[0]for x in range(1, len(snums)):
left, right = snums[:x], snums[x:]
l = '/'.join(left)
if len(right) == 1:
yield l + '/' + right[0]
else:
for r in solve(right):
yield l + '/(' + r + ')'
ans, best = '', 0
for expr in solve(map(str, nums)):
val = eval(expr.replace('/', '.0/'))
if val > best: ans, best = expr, val
return ans