Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 求数组中元素的乘积和求和、减法和除法的最大值_C++_Algorithm_Dynamic Programming - Fatal编程技术网

C++ 求数组中元素的乘积和求和、减法和除法的最大值

C++ 求数组中元素的乘积和求和、减法和除法的最大值,c++,algorithm,dynamic-programming,C++,Algorithm,Dynamic Programming,您好,我有以下问题要解决: 我有两个数组n整数数组和n-1运算数组 整数[n]/n整数 操作[n-1]/n-1操作(例如+-*/) 数字数组是固定的,而运算符数组可用于任何排列,以获得最大值(谢谢您@) 例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=16

您好,我有以下问题要解决:

我有两个数组n整数数组和n-1运算数组

  • 整数[n]
    /n整数
  • 操作[n-1]
    /n-1操作(例如+-*/)
数字数组是固定的,而运算符数组可用于任何排列,以获得最大值(谢谢您@

例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

您可以采用与此问题类似的方法:

,

唯一的区别是它谈到匹配数字N,你可以找到最大和

这里的想法是生成与数组长度相同的运算符组合

  • 您可以使用Hashmap存储运算符和计数。这样,在构建表达式时,可以跟踪每个运算符的计数<代码>地图
  • 编写单独的函数来求解表达式<代码>获取结果(表达式)
  • 使用
    std::next\u排列:
  • 反复浏览数字列表:
  • 获取每个表达式的结果
  • 跟踪当前最大值,并跟踪最大值的表达式
  • 最后返回
    current\u max
    expression\u max

  • 对于这个问题,代码比word更好。代码中的状态转移方程很清楚

    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))
    
    导入工具
    test1=(1,2,7,5,1,2)
    test2=(1,3,5,6,9,10,12,14)
    @functools.lru_cache()
    def基本解决方案(nums、add、sub、mul、div、长度):
    
    如果addAs只有4种类型的操作,则排列的数量小于
    n。你的代码在Python中,而问题是标记C++。请指定适当的标记以避免混淆。因此,基本上,数字数组是固定的,而运算符数组可以用于任何排列以获得最大值?@grek40 yes!运算符数组任意排列得到最大值,谢谢!数字可以是
    0
    或负数,还是只有正数和非零数?你确定你的代码是一个合适的解决方案,没有任何解释吗?@grek40对不起,我不知道哪部分比较混乱,需要解释。唯一的窍门是乘法和除法的特例。从加法和减法开始,然后你会找到状态转移方程。