- ννΈλ₯Ό μλ³΄κ³ νμ΄λ³Όλ €κ³ νμΌλ μμ μλΆμ‘±μ΄μλ λ¬Έμ .
- κ° λ μ§λ³λ‘ 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];
}
}