2022-04-09:给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m , 数组下标 从 1 开始 计数。 初始时,你的分数为 0 。 你需要执行恰好 m 步操作。在第 i 步操作(从 1 开始 计数)中,需要: 选择数组 nums 开头处或者末尾处 的整数 x 。 你获得 multipliers[i] * x 分,并累加到你的分数中。 将 x 从数组 nums 中移除。 在执行 m 步操作后,返回 最大 分数。 力扣1770。

答案2022-04-09:

样本对应模型。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
	nums := []int{-5, -3, -3, -2, 7, 1}
	multipliers := []int{-10, -5, 3, 4, 6}
	ret := maximumScore2(nums, multipliers)
	fmt.Println(ret)
}

func maximumScore2(A, B []int) int {
	if len(A) == 0 || len(B) == 0 || len(A) < len(B) {
		return 0
	}
	N := len(A)
	M := len(B)
	dp := make([][]int, M+1)
	for i := 0; i < M+1; i++ {
		dp[i] = make([]int, M+1)
	}
	for L := M - 1; L >= 0; L-- {
		for j := L + 1; j <= M; j++ {
			R := N - M + j - 1
			indexB := L + N - R - 1
			dp[L][j] = getMax(A[L]*B[indexB]+dp[L+1][j], A[R]*B[indexB]+dp[L][j-1])
		}
	}
	return dp[0][M]
}

func getMax(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

执行结果如下:

在这里插入图片描述


左神java代码