Max Dot Product of Two Subsequences

HardArrayDynamic Programming

Solution

export function maxDotProduct(nums1: number[], nums2: number[]): number {
  const minmax = (nums: number[]): [number, number] => {
    return nums.reduce(
      ([min, max], num) => [Math.min(min, num), Math.max(max, num)],
      [Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER],
    );
  };
 
  const [min1, max1] = minmax(nums1);
  const [min2, max2] = minmax(nums2);
  if (max1 < 0 && 0 < min2) {
    return max1 * min2;
  }
  if (0 < min1 && max2 < 0) {
    return min1 * max2;
  }
 
  const [n, m] = [nums1.length, nums2.length];
  const dp = new Array(n + 1).fill(undefined).map(() => new Array(m + 1).fill(0));
  for (let i = n - 1; 0 <= i; i--) {
    for (let j = m - 1; 0 <= j; j--) {
      dp[i][j] = Math.max(dp[i + 1][j], dp[i][j + 1], nums1[i] * nums2[j] + dp[i + 1][j + 1]);
    }
  }
 
  return dp[0][0];
}