1425. Constrained Subsequence Sum

  • μ „ν˜€ 풀이 방법을 μƒκ°ν•˜μ§€ λͺ»ν•œ 문제.
    • 각 index에 λŒ€ν•΄μ„œ 이전 indexκΉŒμ§€μ˜ μ΅œλŒ€ ν•© + ν˜„μž¬ index의 값을 μ„ νƒν•˜λŠ” 경우, μ•„λ‹Œ 경우λ₯Ό μΆ”μ ν•˜μ—¬ μ΅œλŒ€ 합을 κ΅¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ 풀어보렀고 ν–ˆμ§€λ§Œ λ„μ €νžˆ 점화식을 λ§Œλ“œλŠ” 방법이 생각이 μ•ˆ λ‚˜μ„œ μ‹€νŒ¨ν•¨.
  • Monotone queueλ₯Ό ν™œμš©ν•΄μ•Ό ν•œλ‹€.
    • Queueμ—λŠ” 숫자의 index 값을 μœ μ§€ν•œλ‹€.
    • Queue의 μ•žμͺ½μ—λŠ” 쑰건을 λ§Œμ‘±ν•˜λŠ” (κ°€μž₯ 큰) subset sum 값을 κ°€λ¦¬ν‚€λŠ” indexκ°€ μœ„μΉ˜ν•˜λ„λ‘ ν•œλ‹€.
    • 이λ₯Ό μœ„ν•΄μ„œ queue의 λ’€μͺ½μ— ν˜„μž¬ μœ„μΉ˜μ˜ subset sum nums[i] 보닀 μž‘μ€ 값이 μžˆλŠ” 경우 λͺ¨λ‘ μ œκ±°ν•œλ‹€.
    • κ·Έ λ‹€μŒ queue에 ν˜„μž¬ subset sum nums[i] 값을 λ„£λŠ”λ‹€.
    • μ΄λ ‡κ²Œ ν•˜λ©΄ queue에 μžˆλŠ” 값은 항상 단쑰 κ°μ†Œν•˜λŠ” ν˜•νƒœλ‘œ μœ μ§€λœλ‹€.
  • μ„ μž…μ„ μΆœμ΄λ―€λ‘œ queue의 μ•žμ— μžˆλŠ” indexκ°€ κ°€μž₯ μž‘μ€ index κ°’μ΄λœλ‹€. 이 값이 λ²”μœ„ kλ₯Ό λ²—μ–΄λ‚œ 경우 μ œκ±°ν•œλ‹€.
class Solution { public: int constrainedSubsetSum(vector<int>& nums, int k) { deque<int> indices; int result = nums[0]; for (int i = 0; i < nums.size(); ++i) { nums[i] += !indices.empty()? nums[indices.front()] : 0; result = max(result, nums[i]); while (!indices.empty() && nums[i] > nums[indices.back()]) indices.pop_back(); if (nums[i] > 0) indices.push_back(i); if (!indices.empty() && i - indices.front() >= k) indices.pop_front(); } return result; } };