1458. Max Dot Product of Two Subsequences
https://leetcode.com/problems/max-dot-product-of-two-subsequences/
My solution during contest
class Solution:
def maxDotProduct(self, nums1: List[int], nums2: List[int]) -> int:
m = len(nums1)
n = len(nums2)
res = float("-inf")
if (all([num1 <= 0 for num1 in nums1]) and all([num2 >=0 for num2 in nums2])) or (all([num1 >= 0 for num1 in nums1]) and all([num2 <= 0 for num2 in nums2])):
return max(min(nums1)*max(nums2), max(nums1)*min(nums2))
dp = [[0]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
dp[i][j] = max([dp[i][j-1],dp[i-1][j],dp[i-1][j-1] + nums1[i-1] * nums2[j-1]])
res = max(res,dp[i][j])
return res
New Version:
4 scenarios:
dp[i][j] = dp[i-1][j-1] + nums[i-1] * nums[j-1]
dp[i][j] = dp[i-1][j] ignore last i
dp[i][j] = dp[i][j-1] ignore last j
start fresh: nums[i-1] * nums[j-1]
Can avoid the if all(....) check for [-1,-2,3] and [1,2,3] situation
class Solution:
def maxDotProduct(self, nums1: List[int], nums2: List[int]) -> int:
m = len(nums1)
n = len(nums2)
dp = [[float("-inf")]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
dp[i][j] = max([nums1[i-1] * nums2[j-1],dp[i][j-1],dp[i-1][j],dp[i-1][j-1] + nums1[i-1] * nums2[j-1]])
return dp[m][n]
Need to initialize dp with float("-inf") for this one
Last updated
Was this helpful?