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:

  1. dp[i][j] = dp[i-1][j-1] + nums[i-1] * nums[j-1]

  2. dp[i][j] = dp[i-1][j] ignore last i

  3. dp[i][j] = dp[i][j-1] ignore last j

  4. 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?