Giả sử chúng ta có hai mảng gọi là nums1 và nums2, chúng có cùng số phần tử N. Bây giờ hãy xem xét một tập S có N phần tử từ 1 đến N. Chúng ta phải tìm giá trị của (nums1 [i1] + nums1 [i2] +. .. nums1 [ik]) ^ 2 + (nums2 [i1] + nums2 [i2] + ... nums2 [ik]) ^ 2 trong đó {i1, i2, ... ik} là tập con không rỗng của tập S .
Vì vậy, nếu đầu vào giống như nums1 =[-1, 6] nums2 =[5, 4], thì đầu ra sẽ là 106 vì
- (-1) ^ 2 + (5) ^ 2 =26
- (6) ^ 2 + (4) ^ 2 =50
- (-1 + 6) ^ 2 + (5 + 4) ^ 2 =106
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- vs:=danh sách các cặp (nums1 [i], nums2 [i]) cho mỗi i trong phạm vi 0 đến kích thước của nums1 - 1
- vs:=sắp xếp so với tan-nghịch đảo của v [1] / v [0] cho mỗi v trong vs
- tốt nhất:=0
- đối với tôi trong phạm vi từ 0 đến kích thước vs - 1, thực hiện
- u:=so với [i]
- l:=u [0] * u [0] + u [1] * u [1]
- đối với mỗi v trong danh sách nối với vs và vs lại từ chỉ mục i + 1 đến (i + kích thước của vs - 1), hãy thực hiện
- t1:=(u [0] + v [0], u [1] + v [1])
- t2:=t1 [0] * t1 [0] + t1 [1] * t1 [1]
- nếu t2> =l, thì
- u:=t1
- l:=t2
- nếu l> tốt nhất, thì
- tốt nhất:=l
- u:=so với [i]
- l:=u [0] * u [0] + u [1] * u [1]
- đối với mỗi v ngược lại danh sách kết hợp của vs và vs lại từ chỉ mục i + 1 đến i + kích thước của vs -1], thực hiện
- t1:=(u [0] + v [0], u [1] + v [1])
- t2:=t1 [0] * t1 [0] + t1 [1] * t1 [1]
- nếu t2> =l, thì
- u:=t1
- l:=t2
- nếu l> tốt nhất thì
- trở lại tốt nhất
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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))
Đầu vào
[-1, 6], [5, -4]
Đầu ra
52