查找产品的最大值以及数组中元素的求和、减法和除法

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&lt;operator, count&gt; 编写单独的函数来求解表达式。 Getresult(expression) 使用std::next_permutation: 使用数字和运算符计算所有组合 遍历数字列表: 获取每个表达式的结果 最多跟踪 current_maxexpression_max。 终于返回current_maxexpression_max

【讨论】:

以上是关于查找产品的最大值以及数组中元素的求和、减法和除法的主要内容,如果未能解决你的问题,请参考以下文章

添加,减法,除法和乘以存储在布尔数组中的两个二进制数

在 Array Angular 和 Typescript 中查找最小和最大元素

数组的多种用法

查找数字字段中的最大和

高精度加法,减法,乘法,除法

C语言定义一个求数组n个元素的和的函数