π§ββοΈμ΄λ³΄μμ© κ°μ΄λ 'Max Dot Product of Two Subsequences' β LeetCode 1458 (C++, Python, JavaScript)
Source: Dev.to

λ¬Έμ μμ½
μ£Όμ΄μ§ κ²:
- μ μ λ°°μ΄ λ κ°,
nums1μnums2.
λͺ©ν:
- λ λ°°μ΄μμ κΈΈμ΄κ° κ°μ λΉμ΄ μμ§ μμ λΆλΆ μμ΄λ€ μ¬μ΄μ μ΅λ λ΄μ μ μ°Ύλλ€.
μ§κ΄
μ΄ λ¬Έμ μ ν΅μ¬μ λμ νλ‘κ·Έλλ°μ μμ΅λλ€. μ°λ¦¬λ λΆλΆμμ΄μ μ°Ύκ³ μκΈ° λλ¬Έμ, κ° λ¨κ³μμ νμ¬ μ«μλ€μ κ³±μ ν¬ν¨μν¬μ§, λμ€μ λ μ’μ μμ μ°ΎκΈ° μν΄ κ±΄λλΈμ§λ₯Ό κ²°μ ν©λλ€.
μ°λ¦¬λ dp[i][j]κ° μ²« λ²μ§Έ λ°°μ΄μ μΈλ±μ€ iκΉμ§μ λ λ²μ§Έ λ°°μ΄μ μΈλ±μ€ jκΉμ§μ μμλ€μ μ¬μ©νμ¬ μ»μ μ μλ μ΅λ μ κ³±μ λνλ΄λ 2μ°¨μ 격μλ₯Ό ꡬμΆν©λλ€.
κ° μΈλ±μ€ μ (i, j)μ λν΄ μΈ κ°μ§ μ νμ΄ μμ΅λλ€:
- μλ‘μ΄ κ³±μ μμνκ±°λ μ΄μ κ³±μ νμ₯ β
A[i] * B[j]λ₯Ό κ³μ°ν©λλ€. μ΄μ μ΅μ κ²°κ³Όdp[iβ1][jβ1]κ° μμλΌλ©΄, μ΄λ₯Ό νμ¬ κ³±μ λν©λλ€. - 첫 λ²μ§Έ λ°°μ΄μ νμ¬ μμλ₯Ό 건λλ°κΈ° β
dp[iβ1][j]λ₯Ό κ·Έλλ‘ κ°μ Έμ΅λλ€. - λ λ²μ§Έ λ°°μ΄μ νμ¬ μμλ₯Ό 건λλ°κΈ° β
dp[i][jβ1]λ₯Ό κ·Έλλ‘ κ°μ Έμ΅λλ€.
μ΄λ¬ν μ΅μ λ€μ κ³ λ €ν¨μΌλ‘μ¨ κ²©μλ μ μ°¨ μ΅λ κ°λ₯ν κ°λ€λ‘ μ±μμ§κ³ , μ΅μ’ λ΅μ μ€λ₯Έμͺ½ μλ μ μ μμΉνκ² λ©λλ€.
μ½λ λΈλ‘
C++
class Solution {
public:
int maxDotProduct(vector& A, vector& B) {
int n = A.size(), m = B.size();
vector> dp(n, vector(m));
for (int i = 0; i 0 && j > 0) {
dp[i][j] += max(dp[i - 1][j - 1], 0);
}
// Choice 2: Skip current element from A
if (i > 0) {
dp[i][j] = max(dp[i][j], dp[i - 1][j]);
}
// Choice 3: Skip current element from B
if (j > 0) {
dp[i][j] = max(dp[i][j], dp[i][j - 1]);
}
}
}
return dp[n - 1][m - 1];
}
};
νμ΄μ¬
class Solution:
def maxDotProduct(self, A: List[int], B: List[int]) -> int:
n, m = len(A), len(B)
dp = [[0] * m for _ in range(n)]
for i in range(n):
for j in range(m):
current_product = A[i] * B[j]
if i > 0 and j > 0:
dp[i][j] = current_product + max(dp[i - 1][j - 1], 0)
else:
dp[i][j] = current_product
if i > 0:
dp[i][j] = max(dp[i][j], dp[i - 1][j])
if j > 0:
dp[i][j] = max(dp[i][j], dp[i][j - 1])
return dp[n - 1][m - 1]
μλ°μ€ν¬λ¦½νΈ
/**
* @param {number[]} A
* @param {number[]} B
* @return {number}
*/
var maxDotProduct = function (A, B) {
const n = A.length;
const m = B.length;
const dp = Array.from({ length: n }, () => Array(m).fill(0));
for (let i = 0; i 0 && j > 0) {
dp[i][j] = currentProduct + Math.max(dp[i - 1][j - 1], 0);
} else {
dp[i][j] = currentProduct;
}
if (i > 0) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j]);
}
if (j > 0) {
dp[i][j] = Math.max(dp[i][j], dp[i][j - 1]);
}
}
}
return dp[n - 1][m - 1];
};
ν΅μ¬ μμ
- Subsequence vs. Subarray: λΆλΆμμ΄μ μμλ μ°μλ νμκ° μμΌλ©°, κ·Έλμ
dp[iβ1][j]μdp[i][jβ1]λ₯Ό μ¬μ©ν΄ μμλ₯Ό β건λλΈβ μ μμ΅λλ€. - Dynamic Programming Power: μ€κ° κ²°κ³Όλ₯Ό ν μ΄λΈμ μ μ₯ν¨μΌλ‘μ¨ μ§μ μκ° λ¬Έμ λ₯Ό κ΄λ¦¬ κ°λ₯ν μ΄μ°¨ μκ° λ¬Έμ λ‘ λ³νν©λλ€.
- Handling Negative Numbers: μ
max(dp[iβ1][jβ1], 0)μ μ΄μ λΆλΆμμ΄μ΄ νμ¬ κ³±μ ν₯μμν€λμ§, μλλ©΄ μλ‘ μμν΄μΌ νλμ§λ₯Ό κ²°μ ν©λλ€.
μ΅μ’ μκ°
μ΄ λ¬Έμ λ λμ νλ‘κ·Έλλ°μ΄ ν° νμ 곡κ°μ ν¨μ¨μ μΌλ‘ νμν μ μμμ 보μ¬μ€λλ€. μ μ¬ν κΈ°λ²μ μΆμ² μμ€ν (μ¬μ©μ κ΄μ¬μ¬λ₯Ό μ ν νκ·Έμ λ§€μΉ)κ³Ό μλ¬Όμ 보ν(DNA μμ΄ λΉκ΅)μμ μ¬μ©λ©λλ€. μ΄ ν¨ν΄μ λ§μ€ν°νλ©΄ λκ·λͺ¨ λ°μ΄ν° λ§€μΉμ ν¬ν¨νλ κΈ°μ λ©΄μ μμ κ°λ ₯ν μ΄μ μ μ»μ μ μμ΅λλ€.