package q1458 import "math" func maxDotProduct(nums1 []int, nums2 []int) int { board := make([][]int, len(nums1)) boardBuf := make([]int, len(nums1)*len(nums2)) for i := range board { board[i] = boardBuf[i*len(nums2) : (i+1)*len(nums2)] } maxSingle := math.MinInt for i1 := range nums1 { for i2 := range nums2 { prod := nums1[i1] * nums2[i2] maxSingle = max(maxSingle, prod) if i1 > 0 && i2 > 0 { prod += board[i1-1][i2-1] } board[i1][i2] = max(0, prod) if i2 > 0 { board[i1][i2] = max(board[i1][i2-1], board[i1][i2]) } if i1 > 0 { board[i1][i2] = max(board[i1-1][i2], board[i1][i2]) } } } if maxSingle <= 0 { return maxSingle } return board[len(nums1)-1][len(nums2)-1] } var _ = maxDotProduct