使用 Python 中给定的一组数字查找表达式的最大可能值的程序
假设我们有两个名为nums1和nums2的数组,它们具有相同数量的元素N。现在考虑一个包含从1到N的N个元素的集合S。我们必须找到(nums1[i1]+nums1[i2]+...nums1[ik])^2+(nums2[i1]+nums2[i2]+...nums2[ik])^2其中{i1,i2,...ik}是集合S的非空子集.
因此,如果输入类似于nums1=[-1,6]nums2=[5,4],那么输出将是106,因为
(-1)^2+(5)^2=26
(6)^2+(4)^2=50
(-1+6)^2+(5+4)^2=106
示例
让我们看看以下实现以获得更好的理解-
from math import atan2
def solve(nums1, nums2):
vs = zip(nums1,nums2)
vs = sorted(vs, key=lambda v: atan2(v[1],v[0]))
best = 0
for i in range(len(vs)):
u = vs[i]
l = u[0]*u[0]+u[1]*u[1]
for v in (vs+vs)[i+1:(i+len(vs))]:
t1 = (u[0]+v[0],u[1]+v[1])
t2 = t1[0]*t1[0]+t1[1]*t1[1]
if t2 >= l:
u = t1
l = t2
if l > best:
best = l
u = vs[i]
l = u[0]*u[0]+u[1]*u[1]
for v in reversed((vs+vs)[i+1:(i+len(vs))]):
t1 = (u[0]+v[0],u[1]+v[1])
t2 = t1[0]*t1[0]+t1[1]*t1[1]
if t2 >= l:
u = t1
l = t2
if l > best:
best = l
return best
nums1 = [-1, 6]
nums2 = [5, -4]
print(solve(nums1, nums2))输入
[-1, 6], [5, -4]输出结果
52