Leetcode 3290. 最高乘法得分

'''
给你一个大小为 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]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值