1229번: 육각수
육각수는 육각형을 이용해 정의할 수 있다. hn은 한 변에 점 1, 2, ..., n개가 있는 육각형을 점 하나만 겹치게 그렸을 때 존재하는 서로 다른 점의 개수이다. 그림 1 그림1은 h1, h2, h3, h4를 의미하며,
www.acmicpc.net
접근법
점화식을 잘 세우면 금방 풀 수 있는 문제
이 식을 잘 도출할 수 있다면 다음 필요한 dp를 구하는 것은 어렵지 않다.
육각수 배열을 h라 할 때, dp[n]은 h[i]값이 n을 넘지 않는 한에서, dp[n-h[i]]의 최솟값을 구하면 된다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static final int MAX_N = 146858;
static int[] six_angle = new int[MAX_N + 1];
static int[] dp;
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(br.readLine());
process_six_angle();
dp = new int[N + 1];
Arrays.fill(dp, MAX_N);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= N; i++) {
for (int j = 1; j <= i; j++) {
if (six_angle[j] > i) {
break;
}
if (dp[i - six_angle[j]] + 1 < dp[i]) {
dp[i] = dp[i - six_angle[j]] + 1;
}
}
}
System.out.println(dp[N]);
}
public static void process_six_angle() {
six_angle[1] = 1;
for (int i = 2; i <= MAX_N; i++) {
six_angle[i] = (i - 1) * 6 + six_angle[i - 1] - (2 * (i - 1) - 1); // hn에 대한 점화식
}
}
}
결과
메모리 | 시간 | 언어 |
18700KB | 1268ms | Java |
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ] 13144 - List Of Unique Numbers (Java) (0) | 2023.08.14 |
---|---|
[BOJ] 1027 - 고층 건물 (Java) (0) | 2023.08.09 |
[백준] 1005-ACM Craft (Python) (0) | 2023.03.05 |
[백준] 1744 - 수 묶기 (Python) (0) | 2023.03.01 |
[백준] 2565 전깃줄 (Python) (0) | 2023.02.20 |