1335. Minimum Difficulty of a Job Schedule

  • 힌트λ₯Ό μ•ˆλ³΄κ³  ν’€μ–΄λ³Όλ €κ³  ν–ˆμœΌλ‚˜ μ—­μ‹œ μ—­λΆ€μ‘±μ΄μ—ˆλ˜ 문제.
    • 각 λ‚ μ§œλ³„λ‘œ index ꡬ간을 λ‚˜λˆ„μ–΄μ•Ό ν•˜λŠ”λ° 이걸 memoization으둜 μ–΄λ–»κ²Œ ν‘œν˜„ν•΄μ•Ό 될지 λͺ°λΌμ„œ ν—€λ§Έλ‹€.
  • νŠΉμ • λ‚ μ§œμ— νŠΉμ • index의 μž‘μ—…κΉŒμ§€ μ²˜λ¦¬ν•œ 경우λ₯Ό memoizationν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€.
  • λ¨Όμ € memoization arrayλ₯Ό κ°€λŠ₯ν•œ μ΅œλŒ€κ°’μœΌλ‘œ μ±„μš΄λ‹€ (λ‘œμ§μ„ λ‹¨μˆœν™”ν•˜κΈ° μœ„ν•΄).
    • λ˜λŠ” invalid ν•œ κ°’ -1으둜 채웠닀가 μ²΄ν¬ν•˜λŠ” 방법도 있긴 ν•˜λ‹€.
  • 첫번째 날은 μ•„λž˜μ™€ 같이 κ³„μ‚°ν•œλ‹€.
    • 첫번째 날에 첫번째 index의 μž‘μ—… λ‚œμ΄λ„ dp[0][0]λŠ” λ‹¨μˆœνžˆ 전체 λ‚œμ΄λ„μ˜ 첫번째 κ°’ jobDifficulty[0]κ³Ό λ™μΌν•˜λ‹€.
    • 첫번째 λ‚ μ˜ νŠΉμ • index의 μž‘μ—… λ‚œμ΄λ„λŠ” 이전 index의 μž‘μ—… λ‚œμ΄λ„ dp[0][i - 1]와 ν˜„μž¬ index의 μž‘μ—… λ‚œμ΄λ„ jobDifficulty[i] 쀑 큰 값이닀.
  • λ‘λ²ˆμ§Έ λ‚  λΆ€ν„°λŠ” μ•„λž˜μ™€ 같이 κ³„μ‚°ν•œλ‹€.
    • νŠΉμ • ꡬ간 [from, to]을 μž‘λŠ”λ‹€ (끝점이 포함됨에 μ£Όμ˜ν•œλ‹€).
      • κ΅¬κ°„μ˜ μ‹œμž‘μ  from은 해당일보닀 μž‘μ„ 수 μ—†λ‹€ day ≀ from < n. μ™œλƒν•˜λ©΄ ν•˜λ£¨μ— 적어도 ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
      • κ΅¬κ°„μ˜ λ§ˆμ§€λ§‰μ  to은 μ‹œμž‘μ λ³΄λ‹€ μž‘μ„ 수 μ—†λ‹€ from ≀ to < n.
    • νŠΉμ • κ΅¬κ°„μ˜ μž‘μ—… λ‚œμ΄λ„ diffλ₯Ό κ΅¬ν•œλ‹€.
      • 미리 κ³„μ‚°ν•΄λ‘˜ μˆ˜λ„ μžˆμ§€λ§Œ μ–΄μ°¨ν”Ό from, to 2쀑 루프λ₯Ό 돌고 μžˆμœΌλ‹ˆ λ©”λͺ¨λ¦¬λ₯Ό μ•„λΌλŠ” μ°¨μ›μ—μ„œ 맀번 κ³„μ‚°ν•œλ‹€.
    • 이전 λ‚ μ§œ day - 1의 이전 ꡬ간 [0, from)의 μž‘μ—… λ‚œμ΄λ„μΈ dp[day - 1][from -1]와 ν˜„μž¬ ꡬ간 [from, to]의 μž‘μ—… λ‚œμ΄λ„λ₯Ό λ”ν•œλ‹€.
    • 이 결과값을 기쑴에 μ €μž₯된 [0, to] κ΅¬κ°„μ˜ 결과값인 dp[day][to]와 λΉ„κ΅ν•˜μ—¬ μž‘μ€ 값을 λ‹€μ‹œ μ €μž₯ν•œλ‹€.
  • μ΅œμ’… 결과값은 λ§ˆμ§€λ§‰ λ‚ , λͺ¨λ“  indexλ₯Ό λ‹€ μ²˜λ¦¬ν•œ 결과인 dp[d - 1][n - 1]이 λœλ‹€.
class Solution { final int MAX_VALUE = 300 * 1000; public int minDifficulty(int[] jobDifficulty, int d) { int n = jobDifficulty.length; if (n < d) return -1; int[][] dp = new int[d][n]; for (int i = 0; i < d; ++i) { Arrays.fill(dp[i], MAX_VALUE); } dp[0][0] = jobDifficulty[0]; for (int i = 1; i < n; ++i) { dp[0][i] = Math.max(dp[0][i - 1], jobDifficulty[i]); } for (int day = 1; day < d; ++day) { for (int from = day; from < n; ++from) { int diff = 0; for (int to = from; to < n; ++to) { diff = Math.max(diff, jobDifficulty[to]); int newValue = dp[day - 1][from - 1] + diff; dp[day][to] = Math.min(dp[day][to], newValue); } } } return dp[d - 1][n - 1]; } }