# Program to find maximum possible value of an expression using given set of numbers in Python

PythonServer Side ProgrammingProgramming

#### Beyond Basic Programming - Intermediate Python

Most Popular

36 Lectures 3 hours

#### Practical Machine Learning using Python

Best Seller

91 Lectures 23.5 hours

#### Practical Data Science using Python

22 Lectures 6 hours

Suppose we have two arrays called nums1 and nums2, they have same number of elements N. Now consider a set S with N elements from 1 through N. We have to find the value of (nums1[i1] + nums1[i2] + ... nums1[ik])^2 + (nums2[i1] + nums2[i2] + ... nums2[ik])^2 where {i1, i2, ... ik} is non empty subset of the set S.

So, if the input is like nums1 = [-1, 6] nums2 = [5, 4], then the output will be 106 because

• (-1)^2 + (5)^2 = 26
• (6)^2 + (4)^2 = 50
• (-1 + 6)^2 + (5 + 4)^2 = 106

To solve this, we will follow these steps −

• vs := a list of pairs (nums1[i], nums2[i]) for each i in range 0 to size of nums1 - 1
• vs := sort vs by tan-inverse of v[1]/v[0] for each v in vs
• best := 0
• for i in range 0 to size of vs - 1, do
• u := vs[i]
• l := u[0]*u[0]+u[1]*u[1]
• for each v in the concatenated list of vs and vs again from index i+1 to (i+ size of vs - 1), do
• t1 := (u[0]+v[0], u[1]+v[1])
• t2 := t1[0]*t1[0]+t1[1]*t1[1]
• if t2 >= l, then
• u := t1
• l := t2
• if l > best, then
• best := l
• u := vs[i]
• l := u[0]*u[0]+u[1]*u[1]
• for each v in reverse the concatenated list of vs and vs again from index i+1 to i+ size of vs -1], do
• t1 := (u[0]+v[0], u[1]+v[1])
• t2 := t1[0]*t1[0]+t1[1]*t1[1]
• if t2 >= l, then
• u := t1
• l := t2
• if l > best, then
• return best

## Example

Let us see the following implementation to get better understanding −

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))

## Input

[-1, 6], [5, -4]

## Output

52
Updated on 11-Oct-2021 08:50:15