이 문제는 설명과 코드 상세를 보며 먼저 이해해보자.
이 문제는 손으로 직접 써보고 나서 이해하기 쉬웠다.
여기서도 dp[N]의 값은 제곱수의 최소 갯수가 저장된다.
N = 11을 기준으로 보자면
쉽게 표시를 하기위해 지수는 생략하고 밑 수만 표기하면
for(int i = 2; i <= N; i++) {
int min = Integer.MAX_VALUE;
for(int j = 1; j <= i / 2; j++) {
if(j * j == i) {
min = 1;
break;
} else {
min = Math.min(min, dp[i - j] + dp[j]);
}
}
dp[i] = min;
}
private static int bottom_up2(int N) {
for(int i = 2; i <= N; i++) {
dp[i] = i;
for(int j = 1; j * j<= i; j++) {
dp[i] = Math.min(dp[i], dp[i - j*j] + 1);
}
}
return dp[N];
}
static Integer[] dp;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
dp[0] = 0;
dp[1] = 1;
private static int bottom_up2(int N) {
for(int i = 2; i <= N; i++) {
dp[i] = i;
for(int j = 1; j * j<= i; j++) {
dp[i] = Math.min(dp[i], dp[i - j*j] + 1);
}
}
return dp[N];
}
System.out.println(bottom_up2(N));
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static Integer[] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
dp = new Integer[N + 1];
dp[0] = 0;
dp[1] = 1;
System.out.println(bottom_up2(N));
}
private static int bottom_up(int N) {
for(int i = 2; i <= N; i++) {
int min = Integer.MAX_VALUE;
for(int j = 1; j <= i / 2; j++) {
if(j * j == i) {
min = 1;
break;
} else {
min = Math.min(min, dp[i - j] + dp[j]);
}
}
dp[i] = min;
}
return dp[N];
}
private static int bottom_up2(int N) {
for(int i = 2; i <= N; i++) {
dp[i] = i;
for(int j = 1; j * j<= i; j++) {
dp[i] = Math.min(dp[i], dp[i - j*j] + 1);
}
}
return dp[N];
}
}