“破山中贼易,破心中贼难。”——王阳明
题目
给你一个大小为 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]
的值。
返回你能够获得的 最大 得分。
难度:中等
分析
题目解答的思路挺巧妙,笔者只能望洋兴叹╮(╯▽╰)╭,记录一下。
我们用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];
}
};