力扣3290. 最高乘法得分随笔

“破山中贼易,破心中贼难。”——王阳明

题目

给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b

你需要从数组 b 中选择四个下标 i0i1i2, 和 i3,并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] + a[1] * b[i1] + a[2] * b[i2] + a[3] * b[i3] 的值。

返回你能够获得的 最大 得分。

难度:中等

分析

        题目解答的思路挺巧妙,笔者只能望洋兴叹╮(╯▽╰)╭,记录一下。

        我们用dp[i]表示选择i个下标后得到的最大值,由于a中每个值都要用到,数组的长度等于a的长度加1(dp[0]=0)。遍历b数组,计算当前值成为第i个被选择的值时得到的结果,更新dp数组,注意如果dp[i-1]==LONG_LONG_MIN,说明该值前面没有i-1个值,不进行计算。此外,应按照i从大到小计算,因为当前值被选择了,则之前肯定不能选择当前的值,计算dp[i]用到的dp[i-1]不应该被当前值更新过。

解答

class Solution {
public:
    long long maxScore(vector<int>& a, vector<int>& b) {
        int n=b.size();
        vector<long long> dp(5,LONG_LONG_MIN);  //选定i个元素的最大值
        dp[0]=0;
        for (int j=0;j<n;j++){
            //选择当前值为第i个值
            for (int i=4;i>=1;i--){
                if (dp[i-1]!=LONG_LONG_MIN)
                dp[i]=max(dp[i],dp[i-1]+1ll*a[i-1]*b[j]);
            }
        }
        return dp[4];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值