μ΄ λ¬Έμ λ₯Ό μ²μμ, λ¨μνκ² νΉμ μ«μμ κ°μ₯ κ°κΉμ΄ μ κ³±μλ₯Ό ꡬνκ³ , νΉμ μ«μμ μ κ³±μμ μ°¨μ΄μ ν΄λΉνλ dpκ°μ λνλ λ°©μμΌλ‘ μ κ·Όμ νμλ€.
μλ₯Ό λ€μ΄, μ΄κΈ°κ°μΌλ‘ dp[1]= 1, dp[2]=2(1+1μ΄λ―λ‘ 2κ°) , dp[3]=3(1+1+1 μ΄λ―λ‘ 3κ°) λ₯Ό μ€μ ν λ€,
λ§μ½ 18μ΄λΌλ©΄, 18κ³Ό κ°μ₯ κ°κΉμ΄ μ κ³±μλ 16μ΄κΈ° λλ¬Έμ, dp[18]=1(16μ΄λ―λ‘ κ°―μ νλ μμ)+dp[2] μ κ°μ λ°©μμΌλ‘ λ§μ΄λ€.
μ¦, μ΄μ κ°μ λ°©μμ μ¬μ©νλ©΄ 18 = 4μ μ κ³± + 1μ μ κ³± + 1μμ κ³± = μ΄ κ°―μ 3κ°κ° λμ€λλ°,
μ¬μ€ 18 = 3μμ κ³± + 3μμ κ³± = 2κ° κ° λ μ΅μκ°―μμ΄λ€.
κ·Έλμ, λ€λ₯Έ λ°©λ²μΌλ‘ λ€μ μ κ·Όν΄μΌ νλ€.
λ¨Όμ , νΉμ μ«μμμ μ κ³±μλ₯Ό μΆμΆνλ κ²μ νμμ μ΄λ€. νμ§λ§, κ·Έκ² λ¬΄μ‘°κ±΄ κ°μ₯ κ°κΉμ΄ μ κ³±μκ° μλ μ μλ€λ μ μ΄λ€.
λ°λΌμ, νΉμ μ«μλ³΄λ€ μμ λͺ¨λ μ κ³±μλ₯Ό νλμ© λ£μ΄ λΉκ΅ν΄λ³΄λ κ³Όμ μ΄ νμνλ€.
dp[] μλ ν΄λΉ μ«μμ μ΅μ μ κ³±μ κ°―μλ₯Ό κΈ°λ‘ν κ²μ΄λ€.
νΉμ μ«μμμ μ κ³±μλ₯Ό λΉΌλ(κ°μ°νλ) κ³Όμ μ μ κ³±μμ κ°―μμ +1 μ λνλ κ³Όμ κ³Ό κ°λ€.
μλ₯Ό λ€μ΄, 17μ μ΅μ μ κ³±μ κ°―μλ₯Ό ꡬνλ€κ³ νλ©΄, λ°ν μ λ°©μμ μν΄ dp[16] κΉμ§λ λ€ μ±μμ Έ μλ€κ³ κ°μ νμ.
17 μ΄νμ μ κ³±μλ 1, 2, 3 ,4 μ΄ μλ€.
- μ κ³±μ 4λ₯Ό λΊ λ,
17 - 16 = 1 μ΄κ³ 17μμ 16μ λΉΌλ κ³Όμ μμ 4μ μ κ³±μ΄ λΆλ¦¬λμμΌλ―λ‘ dp[17] = dp[1] + 1 μ΄ λλ€. - μ κ³±μ 3μ λΊ λ,
17 - 9 = 8 μ΄κ³ , 17μμ 9 λ₯Ό λΉΌλ κ³Όμ μμ 3μ μ κ³±μ΄ λΆλ¦¬λμμΌλ―λ‘ dp[17] = dp[8] +1 μ΄ λλ€. - μ κ³±μ 2λ₯Ό λΊ λ,
17 - 4 = 13 μ΄κ³ , 17μμ 4 λ₯Ό λΉΌλ κ³Όμ μμ 2μ μ κ³±μ΄ λΆλ¦¬λμμΌλ―λ‘ dp[17] = dp[13] + 1 μ΄ λλ€. - μ κ³±μ 1μ λΊ λ,
17 - 1 = 16 μ΄κ³ , 17μμ 1μ λΉΌλ κ³Όμ μμ 1μ μ κ³±μ΄ λΆλ¦¬λμμΌλ―λ‘ dp[17] = dp[16] + 1 μ΄ λλ€.
νΉμ μ«μλ³΄λ€ μμ μ κ³±μλ₯Ό λΉΌκ³ λ¨μ κ°μ dpκ°μ λνκ³ , μ΄λ€ μ€ μ΅μκ°μ κΈ°λ‘νλ©΄ μ΅μ μ κ³± μκ° κΈ°λ‘μ΄ λλ€.
μ΄ κ·μΉμ dp[1] λΆν° dp[input] κ° κΉμ§ μ μ©ν λ€ dp[input]κ°μ μΆμΆνλ©΄ λ΅μ΄ λμ¨λ€!
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
int[] dp = new int[input + 1];
for (int i = 1; i <= input; i++) {
dp[i] = i;
for (int j = 1; j * j <= i; j++) {
dp[i] = Math.min(dp[i - j * j] + 1, dp[i]);
}
}
// System.out.println(Arrays.toString(dp));
System.out.println(dp[input]);
}
}