查找产品的最大值以及数组中元素的求和、减法和除法
Posted
技术标签:
【中文标题】查找产品的最大值以及数组中元素的求和、减法和除法【英文标题】:Finding maximum value of products and sum and subtract and division for elements in array 【发布时间】:2017-11-02 07:23:30 【问题描述】:您好,我有以下我想解决的问题:
我有两个数组 n 整数数组和 n - 1 操作数组
integers[n]
// n 个整数
operations[n - 1]
// n - 1 次操作(例如 + - * /)
数字数组是固定的,而操作符数组可以任意排列以得到最大值(谢谢@grek40)
示例 1:
给定整数数组:1 2 7 5 1 2
和操作数组:+ + + + *
我想找到最大的相邻乘积减除法,即1+2+7*5+1+2 = 41
示例 2:
给定整数数组:1 3 5 6 9 10 12 14
和操作数组:+ + * * - / /
我想找到最大相邻乘积减除法,即1-3/5/6+9+10*12*14 = 1689.9
我是动态编程的初学者。我无法弄清楚以下问题的递归关系。
谁能给点建议?
谢谢!
我尝试使用枚举方法,时间复杂度为 n!
for operators in allOperators:
op = list(operators)
op.append(' ')
operation = ""
for i, number in enumerate(inputNumbers):
count += 1
operation += number + op[i]
output = eval(operation)
if output > maxOutput:
maxOutput = output
【问题讨论】:
由于只有4种操作,排列数少于n!
。
您的代码在 python 中,而问题标记为 C++。请指定适当的标签以防止混淆。
所以基本上,数字数组是固定的,而运算符数组可以用于任何排列以获得最大值?
@grek40 是的!运算符数组任意排列取最大值,谢谢!
数字可以是0
还是负数,还是只能是非零的正数?
【参考方案1】:
代码比文字更能解决这个问题。状态转换方程在代码中很清楚。
import functools
test1 = (1, 2, 7, 5, 1, 2)
test2 = (1, 3, 5, 6 ,9 ,10, 12, 14)
@functools.lru_cache()
def BaseSolution(nums, add, sub, mul, div, length):
if add<0 or sub<0 or mul<0 or div<0 or length<0:
return float("-inf")
if length == 0:
return nums[length]
else:
return max(
BaseSolution(nums, add-1, sub, mul, div, length-1) + nums[length],
BaseSolution(nums, add, sub-1, mul, div, length-1) - nums[length],
MulOrDivSolution(nums, add, sub, mul-1, div, length-1, '*'+str(nums[length])),
MulOrDivSolution(nums, add, sub, mul, div-1, length-1, '/'+str(nums[length])),
)
def MulOrDivSolution(nums, add, sub, mul, div, length, lzayVal):
if add<0 or sub<0 or mul<0 or div<0 or length<0:
return float("-inf")
if length == 0:
return eval( str(nums[length])+lzayVal)
else:
return max(
BaseSolution(nums, add-1, sub, mul, div, length-1) + eval( str(nums[length])+lzayVal),
BaseSolution(nums, add, sub-1, mul, div, length-1) - eval( str(nums[length])+lzayVal),
MulOrDivSolution(nums, add, sub, mul-1, div, length-1, '*'+str(nums[length])+lzayVal),
MulOrDivSolution(nums, add, sub, mul, div-1, length-1, '/'+str(nums[length])+lzayVal),
)
if __name__ == '__main__':
print(BaseSolution(test1,4,0,0,1,5))
print(BaseSolution(test2,2,1,2,2,7))
【讨论】:
你确定你的代码是一个合适的解决方案没有任何解释? @grek40 对不起,我不知道哪个部分混淆了,需要解释。唯一的技巧部分是乘法和除法的特殊情况。从加减法开始,然后你会发现状态过渡方程。【参考方案2】:您可以按照与此问题类似的方法:
Given a list of integer numbers, a list of symbols [+,-,*,/] and a target number N,
唯一的区别是它谈到匹配数字N,你可以找到最大和。
这里的想法是生成与数组长度一样长的运算符组合。
-
您可以使用 Hashmap 来存储运算符和计数。这样,在构建表达式时,您可以跟踪每个运算符的计数。
map<operator, count>
编写单独的函数来求解表达式。 Getresult(expression)
使用std::next_permutation:
使用数字和运算符计算所有组合
遍历数字列表:
获取每个表达式的结果
最多跟踪 current_max
和 expression_max
。
终于返回current_max
和expression_max
【讨论】:
以上是关于查找产品的最大值以及数组中元素的求和、减法和除法的主要内容,如果未能解决你的问题,请参考以下文章