1420. Build Array Where You Can Find The Maximum Exactly K Comparisons

  • κ²°κ΅­ λͺ»ν’€μ—ˆλ˜ 문제. μ•„λž˜μ™€ 같은 λ°©μ‹μœΌλ‘œ μ ‘κ·Όν–ˆλŠ”λ° μ‹€νŒ¨ν–ˆλ‹€.
    • (index, maxValue, cost)λ₯Ό μƒνƒœ State둜 μ •μ˜ν•˜κ³  (0, 0, 0) λΆ€ν„° μ‹œμž‘ν•˜μ—¬ λ‹€μŒ μƒνƒœλ₯Ό κ΅¬ν•œλ‹€.
    • (0, 0, 0)에 λŒ€ν•œ 경우의 μˆ˜λŠ” 1둜 ν•œλ‹€.
    • λ‹€μŒ μƒνƒœλŠ” ν˜„μž¬ μƒνƒœμ—μ„œ index + 1 을 ν•˜κ³  2가지 경우둜 λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•œλ‹€.
      • maxValueκ°€ λ™μΌν•˜λ©΄ costκ°€ κ·ΈλŒ€λ‘œμΈ κ²ƒμ΄λ―€λ‘œ κΈ°μ‘΄ 경우의 μˆ˜μ— maxValue λ§ŒνΌμ„ κ³±ν•œλ‹€.
      • μ΅œλŒ€ 값을 maxValue + 1 ~ mκΉŒμ§€ λ°”κΏ”κ°€λ©΄μ„œ 각각의 경우의 μˆ˜μ— κΈ°μ‘΄ 경우의 수λ₯Ό λ„£λŠ”λ‹€.
  • DPμ—μ„œλŠ” κΈ°μ‘΄ μƒνƒœ κ°’λ“€λ‘œλΆ€ν„° μƒˆλ‘œμš΄ μƒνƒœκ°’μ„ λ§Œλ“€μ–΄λ‚΄λŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€.
    • λ¨Όμ € array의 첫번째 elementλŠ” 1λΆ€ν„° mκΉŒμ§€ 선택 κ°€λŠ₯ν•˜κ³  μ΄λ•Œ 경우의 μˆ˜λŠ” 1이 λœλ‹€. λ”°λΌμ„œ d[1][i][1] = 1 (i = 1, 2, ..., m) 이닀.
    • κ·Έ λ‹€μŒ λ‘λ²ˆμ§Έ element λΆ€ν„° n 번째 elementκΉŒμ§€ 경우의 수λ₯Ό κ³„μ‚°ν•˜λ©΄ λœλ‹€.
      • 각 element에 λŒ€ν•΄μ„œ maxValueκ°€ 1 ~ m인 경우, costκ°€ 1 ~ k 인 κ²½μš°μ— 따라 경우의 수λ₯Ό κ³„μ‚°ν•œλ‹€.
        • d[len][maxValue][cost] 값을 μˆœμ„œλŒ€λ‘œ κ³„μ‚°ν•œλ‹€.
      • μ—¬κΈ°μ„œ 경우의 μˆ˜λŠ” 이전 경우의 수둜 λΆ€ν„° ꡬ할 수 μžˆλŠ”λ° costκ°€ 이전에 λΉ„ν•΄μ„œ μ¦κ°€ν•œ κ²½μš°μ™€ 그렇지 μ•Šμ€ 경우λ₯Ό κ΅¬λΆ„ν•΄μ„œ λ”ν•˜λ©΄ λœλ‹€.
        • costκ°€ μ¦κ°€ν•œ 경우
          • costκ°€ μ¦κ°€ν•˜κΈ° μ „μ˜ μƒνƒœλŠ” d[len - 1][i][cost - 1] 에 ν•΄λ‹Ήλœλ‹€.
          • costκ°€ μ¦κ°€ν–ˆλ‹€λŠ” 것은 이전 maxValue 값이 ν˜„μž¬λ³΄λ‹€ μž‘λ‹€λŠ” μ˜λ―Έμ΄λ‹€. λ”°λΌμ„œ (i = 1 ~ maxValue - 1) 이닀.
          • ν•΄λ‹Ήλ˜λŠ” 값을 λͺ¨λ‘ 더해주면 λœλ‹€.
        • costκ°€ κ·ΈλŒ€λ‘œμΈ 경우
          • costκ°€ κ·ΈλŒ€λ‘œλΌλ©΄ maxValue의 이전, ν˜„μž¬ 값이 λ™μΌν•˜λ‹€λŠ” μ˜λ―Έμ΄λ‹€. κ·Έλ ‡λ‹€λ©΄ array element의 ν˜„μž¬ 값은 1 ~ maxValue μ€‘μ—μ„œ κ³ λ₯Ό 수 μžˆμœΌλ―€λ‘œ 경우의 μˆ˜λŠ” maxValueκ°€ λœλ‹€. 이λ₯Ό 이전 경우의 μˆ˜μ™€ κ³±ν•΄μ•Ό ν•˜λ―€λ‘œ 결과값에 d[len - 1][maxValue][cost] * maxValueλ₯Ό 더해주면 λœλ‹€.
    • μ΅œμ’… κ²°κ³ΌλŠ” 길이가 n, costκ°€ k인 λͺ¨λ“  경우의 수λ₯Ό 더해주면 λœλ‹€.
      • d[n][i][k] (i = 1 ~ m) 값을 λͺ¨λ‘ λ”ν•œλ‹€.
static constexpr long long MOD_BASE = 1e9 + 7; class Solution { public: int numOfArrays(int n, int m, int k) { vector<vector<vector<long long>>> d(n + 1, vector<vector<long long>>(m + 1, vector<long long>(k + 1, 0))); for (int i = 1; i <= m; ++i) { d[1][i][1] = 1; } for (int len = 2; len <= n; ++len) { for (int maxValue = 1; maxValue <= m; ++maxValue) { for (int cost = 1; cost <= k; ++cost) { long long sum = 0; for (int i = 1; i < maxValue; ++i) { sum = (sum + d[len - 1][i][cost - 1]) % MOD_BASE; } d[len][maxValue][cost] = (d[len - 1][maxValue][cost] * maxValue + sum) % MOD_BASE; } } } long long result = 0; for (int i = 1; i <= m; ++i) { result = (result + d[n][i][k]) % MOD_BASE; } return result; } };