'''
给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b。
你需要从数组 b 中选择四个下标 i0, i1, i2, 和 i3,并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] + a[1] * b[i1] + a[2] * b[i2] + a[3] * b[i3] 的值。
返回你能够获得的 最大 得分。
示例 1:
输入: a = [3,2,5,6], b = [2,-6,4,-5,-3,2,-7]
输出: 26
解释:
选择下标 0, 1, 2 和 5。得分为 3 * 2 + 2 * (-6) + 5 * 4 + 6 * 2 = 26。
示例 2:
输入: a = [-1,4,5,-2], b = [-5,-1,-3,-2,-4]
输出: -1
解释:
选择下标 0, 1, 3 和 4。得分为 (-1) * (-5) + 4 * (-1) + 5 * (-2) + (-2) * (-4) = -1。
提示:
a.length == 4
4 <= b.length <= 105
-105 <= a[i], b[i] <= 105
'''
class Solution:
def maxScore(self, a: List[int], b: List[int]) -> int:
# 我不知道取哪些元素能获得最大值,所以我把当前我所计算过的,1个数的
# 2个数的,3个数的,4个数的最大值都存起来,最后我只要返回四个数的最大值就好
dp = [-inf,-inf,-inf,-inf]
for x in b:
# 我不知道从哪个元素开始能获得最大值,所以我把可能的起始点都算一遍
# 当我需要前两个数时,且选择了x作为第二个数,第一个数选择历史里最大的那个
# 单数一定能获得可能的两个数的最大值,也即是dp[0] + x*a[1]
# 类似的,当我需要三个数时,且选择了作为第三个数,前两个选择历史里最大的
# 那两个数的和是我当前阶段可能获得的最大的三个数的和,即 dp[1] + x*a[2]
# 四个数同理
dp2=[
x*a[0],
dp[0] + x*a[1],
dp[1] + x*a[2],
dp[2] + x*a[3]
]
# 全部算完后,需要更新一下最大值
# 一个数的就拿 历史一个数的最大值和当前临时算出来的一个数最大值比较
# 两个数的就拿 历史两个数的最大值和当前临时算出来的两个数的最大值比较
# 三个四个类似
for i in range(4):
dp[i] = max(dp[i], dp2[i])
return dp[3]
Leetcode 3290. 最高乘法得分
最新推荐文章于 2024-10-17 20:57:51 发布