C++ 求数组中元素的乘积和求和、减法和除法的最大值
您好,我有以下问题要解决: 我有两个数组n整数数组和n-1运算数组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]
/n-1操作(例如+-*/)操作[n-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,你可以找到最大和 这里的想法是生成与数组长度相同的运算符组合
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对不起,我不知道哪部分比较混乱,需要解释。唯一的窍门是乘法和除法的特例。从加法和减法开始,然后你会找到状态转移方程。