3290. 最高乘法得分

Posted by farmer3-c on March 22, 2026

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] 的值。

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

提示:

  • $a.length == 4$
  • $4 <= b.length <= 10^5$
  • $-10^5 <= a[i], b[i] <= 10^5$

思路

用dp来做,从后往前选取a[i]、b[j]相乘,考虑2种状态:

选当前a[i]、b[j]相乘,继续考虑a[i-1]、b[j-1]

不选选当前a[i]、b[j]相乘,继续考虑a[i]、b[j-1]

状态转换:

dfs(i,j)=max(dfs(i-1,j-1)+a[i]*b[j],dfs(i,j-1))

点击展开/折叠
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
    long long maxScore(vector<int>& a, vector<int>& b) {
        int n=b.size();
        vector<array<long long,4>>memo(n);
        for(auto&row:memo){
            ranges::fill(row,LLONG_MIN);
        }
        auto dfs=[&](auto&&dfs,int i,int j)->long long{
            if(j<0)return 0;
            if(i<0){
                return LLONG_MIN/2;

            }
            auto &res=memo[i][j];
            if(res==LLONG_MIN){
                res=max(dfs(dfs,i-1,j),dfs(dfs,i-1,j-1)+(long long)a[j]*b[i]);
            }
            return res;
        };
        return dfs(dfs,n-1,3);
    }
};

参考