1458. Max Dot Product of Two Subsequences

  • 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의 λ§ˆμ§€λ§‰ element
        • dp[i][N - 1] = max(dp[i + 1][N - 1], nums1[i] * nums[N - 1])
      • nums1μ—μ„œ λ§ˆμ§€λ§‰ element * nums2μ—μ„œ 각 index 별 element
        • dp[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]; } };