使用给定的数字集合查找表达式的最大可能值的Python程序

使用给定的数字集合查找表达式的最大可能值的Python程序

假设我们有两个名为nums1和nums2的数组,它们具有相同的元素数量N。现在考虑一个集合S,该集合具有从1到N的N个元素。我们必须找到(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

要解决此问题,我们将遵循以下步骤:

  • vs:对于0到nums1大小的每个i,数字对(nums1 [i],nums2 [i])的列表
  • vs:根据tan-inverse(vs中的每个v[1]/v[0])对vs进行排序
  • best:0
  • for i in range(0,size of vs-1) do
    • u:vs [i]
    • l:u [0] * u [0] + u [1] * u [1]
    • 对于从索引i + 1到(i + vs大小-1)的vs和vs的连接列表中的每个v,都执行以下操作
      • t1:(u [0] + v [0],u [1] + v [1])
      • t2:t1 [0] * t1 [0] + t1 [1] * t1 [1]
      • 如果t2>= l,则
      • u:t1
      • l:t2
    • 如果l > best,则
      • best:l
    • u:vs [i]
    • l:u [0] * u [0] + u [1] * u [1]
    • 对于从索引i + 1到i + vs大小-1的vs和vs的反向连接列表中的每个v,都执行以下操作
      • t1:(u [0] + v [0],u [1] + v [1])
      • t2:t1 [0] * t1 [0] + t1 [1] * t1 [1]
      • 如果t2>= l,则
      • u:t1
      • l:t2
    • 如果l > best,则
  • 返回best

示例

让我们看以下实现,以获得更好的理解-

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程