- Hintλ₯Ό λ³΄κ³ νΌ λ¬Έμ (DPλ₯Ό μ°μ). Memoizeλ₯Ό ν λ κ°
nums1
, nums2
arrayμμ λͺλ²μ§Έ index λΆν° elementλ₯Ό κ³¨λΌ dot productλ₯Ό κ³μ°ν μ§ κΈ°λ‘νλ©΄ λλ€.
- μ νμ
nums1
, nums2
μ κΈΈμ΄λ₯Ό κ°κ° M
, N
μ΄λΌκ³ ν λ- κ°κ°
M - 1
, N - 1
λΆν° elementλ₯Ό κ³ λ₯΄κ² λλ©΄ λ§μ§λ§ elementμ dot productκ° λλ€. dp[M - 1][N - 1] = nums1[M - 1] * nums2[N - 1]
- μ΄λ₯Ό κΈ°λ°μΌλ‘ μλ λ κ°μ§ κ²½μ°μ κ°μ κ³μ°νλ€
nums1
μμ κ° index λ³ element * nums2
μ λ§μ§λ§ elementdp[i][N - 1] = max(dp[i + 1][N - 1], nums1[i] * nums[N - 1])
nums1
μμ λ§μ§λ§ element * nums2
μμ κ° index λ³ elementdp[M - 1][j] = max(dp[M - 1][j + 1], nums1[M - 1] * nums[j])
- κ³μ° κ³Όμ
- κ³μ° κ³Όμ μμλ
(M - 2 ~ 0, N - 2 ~ 0)
λ²μμ λν΄μ μμμΌλ‘ κ°μ κ³μ°ν΄λκ°λ€. - κ³μ°μμλ λ€μμ 4κ°μ§ κ²½μ°λ₯Ό κ³ λ €νμ¬ κ°μ₯ ν° κ°μ μ·¨νλ€.
- (1) νμ¬ indexμ element κ° dot product
nums1[i] * nums2[j]
- νμ¬ index λ³΄λ€ ν° λ²μμ κ°μ λ€ λ¬΄μνλ κ²½μ°μ ν΄λΉλλ€.
- (2)
(i + 1 ~ M - 1, j + 1 ~ N - 1)
λ²μμ κ° + (1) λ²μ κ° dp[i + 1][j + 1] + nums1[i] * nums2[j]
- νμ¬ indexλ³΄λ€ ν° λ²μμ κ° + νμ¬ indexμ dot productλ‘ κ³μ°νλ κ²½μ°
- (3)
(i + 1 ~ M - 1, j ~ N - 1)
λ²μμ κ° dp[i + 1][j]
- nums1μ νμ¬ index
i
μ κ°μ 무μ
- (4)
(i ~ M - 1, j + 1 ~ N - 1)
λ²μμ κ° dp[i][j + 1]
- nums2μ νμ¬ index
j
μ κ°μ 무μ
- κ²°κ³Όκ°
- κ²°κ΅ μ 체 indexμΈ
(0 ~ M - 1, 0 ~ N - 1)
λ²μμ dot product max κ°μ ꡬν΄μΌ νλ―λ‘ dp[0][0]
μ κ°μ κ²°κ³Όλ‘ λλ €μ£Όλ©΄ λλ€.
class Solution {
public:
int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(500, vector<int>(500, INT_MIN));
int M = nums1.size();
int N = nums2.size();
dp[M - 1][N - 1] = nums1[M - 1] * nums2[N - 1];
for (int i = M - 2; i >= 0; --i) {
dp[i][N - 1] = max(
dp[i + 1][N - 1],
nums1[i] * nums2[N - 1]
);
}
for (int j = N - 2; j >= 0; --j) {
dp[M - 1][j] = max(
dp[M - 1][j + 1],
nums1[M - 1] * nums2[j]
);
}
for (int i = M - 2; i >= 0; --i) {
for (int j = N - 2; j >= 0; --j) {
int product = nums1[i] * nums2[j];
int value = product;
value = max(value, dp[i + 1][j + 1] + product);
value = max(value, dp[i + 1][j]);
value = max(value, dp[i][j + 1]);
dp[i][j] = value;
}
}
return dp[0][0];
}
};