You are given an integer array a of size 4 and another integer array b of size at least 4.
You need to choose 4 indices i0, i1, i2, and i3 from the array b such that i0 < i1 < i2 < i3. Your score will be equal to the value a[0] * b[i0] + a[1] * b[i1] + a[2] * b[i2] + a[3] * b[i3].
Return the maximum score you can achieve.
Example 1:
1 2 3
Input: a = [3,2,5,6], b = [2,-6,4,-5,-3,2,-7]
Output: 26
Explanation:
We can choose the indices 0, 1, 2, and 5. The score will be 3 * 2 + 2 * (-6) + 5 * 4 + 6 * 2 = 26.
Example 2:
1 2 3
Input: a = [-1,4,5,-2], b = [-5,-1,-3,-2,-4]
Output: -1
Explanation:
We can choose the indices 0, 1, 3, and 4. The score will be (-1) * (-5) + 4 * (-1) + 5 * (-2) + (-2) * (-4) = -1.
// the meaning of dp[i][j]: when we are at ith item in a, and jth item in b // the maximum number we can achieve // the state transition: // at jth item of a, we can either match or not vector<vector<longlong>> dp; longlongmaxScore(vector<int>& a, vector<int>& b){ m_ = a.size(), n_ = b.size(); dp.resize(m_, vector<longlong>(n_, LONG_MIN)); dp[0][0] = (longlong)a[0] * b[0]; for (int i = 0; i < m_; i++) { for (int j = i; j < n_ + i + 1 - m_; j++) { if (i) { dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + (longlong)a[i] * b[j]); } elseif (j) { dp[i][j] = max(dp[i][j - 1], (longlong)a[i] * b[j]); } } } return dp[m_ - 1][n_ - 1]; } };
// the meaning of dp[i][j]: when we are at ith item in a, and jth item in b // the maximum number we can achieve vector<array<longlong, 4>> dp; longlongmaxScore(vector<int>& a, vector<int>& b){ m_ = a.size(), n_ = b.size(); dp.resize(n_, array<longlong, 4>({INT_MIN, INT_MIN, INT_MIN, INT_MIN})); longlong res = dfs(0, 0, a, b); return res; }
longlongdfs(int i, int j, vector<int>& a, vector<int>& b){ if (i == m_ || j == n_) { return0; } if (dp[j][i] != INT_MIN) { return dp[j][i]; } longlong res = LLONG_MIN; if (n_ - j > 4 - i) { res = dfs(i, j + 1, a, b); } res = max(res, dfs(i + 1, j + 1, a, b) + (longlong)a[i] * b[j]); dp[j][i] = res; return res; } };