38 lines
758 B
Go
38 lines
758 B
Go
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
|