leetcode 1458

less than 1 minute read

Published:

题目1458

给你两个数组 nums1 和 nums2 。

请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积。

数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,[2,3,5] 是 [1,2,3,4,5] 的一个子序列而 [1,5,3] 不是。

输入样例

输入:nums1 = [2,1,-2,5], nums2 = [3,0,-6] 输出:18 解释:从 nums1 中得到子序列 [2,-2] ,从 nums2 中得到子序列 [3,-6] 。 它们的点积为 (2*3 + (-2)*(-6)) = 18 。

解析

子序列优先往DP靠,dp[i][j]代表nums1[i]nums2[j]之前的最大值,状态转移方程如下: \(max[i][j] = max(f[i−1][j−1]+x_{ij},\ x_{ij},\ f[i−1][j],f[i][j−1],f[i−1][j−1])\)

题解

class Solution:
    def maxDotProduct(self, nums1, nums2):
        m=len(nums1)
        n=len(nums2)
        signal=[[0]*n for _ in range(m)]
        signal[0][0]=nums1[0]*nums2[0]	
        for j in range(n):
            for i in range(m):
                cur,left,up=[nums1[i]*nums2[j]]*3
                if i>0:
                	left=signal[i-1][j]
                if j>0:
                	up=signal[i][j-1]
                signal[i][j]=max(cur,up,left)
                if i>0 and j>0:
                	lefup=signal[i-1][j-1]
                	signal[i][j]=max(signal[i][j],lefup+cur)
        return signal[m-1][n-1]
def main():
	numx=[2,1,-2,5]
	numy=[3,0,-6]
	solu=Solution()
	print(solu.maxDotProduct(numx,numy))
if __name__ == '__main__':
	main()