[BOJ 2688] 줄어들지 않아 (Java, DP)알고리즘/동적 프로그래밍2023. 7. 10. 21:04
Table of Contents
반응형
문제 링크
https://www.acmicpc.net/problem/2688
문제 풀이
- 최대치의 경우 long
- 상향식, 하향식으로 동적 프로그래밍 문제 연습하기 좋은 기본 문제
- 0으로 시작하는 수도 포함
- DP[N][M] = N자리 수이면서 M으로 끝나는 경우의 수를 뜻함
예) DP[2][1] = 2자리 수이고 끝이 1로 끝나는 경우
- DP[1][0 ~ 9] 까지 1로 초기화
시간복잡도
Bottom-Up | Top-Down |
O(64 * 10 * 10) | O(64 * 10 * 10) |
DP[2][i] 의 경우를 살펴보면 아래와 같다
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1개 | 1개 | 1개 | 1개 | 1개 | 1개 | 1개 | 1개 | 1개 | 1개 |
1개 00 |
2개 01 11 |
3개 02 12 22 |
4개 04 14 24 34 44 |
5개 04 ~ 44 |
6개 05 ~ 55 |
7개 06 ~ 66 |
8개 07 ~ 77 |
9개 08 ~ 88 |
10개 09 ~ 99 |
제출 코드
(1) Bottom-Up 방식
import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static InputProcessor inputProcessor = new InputProcessor();
static int T, N;
static long[][] DP;
public static void main(String[] args) throws IOException {
preprocess(); // 전처리
T = inputProcessor.nextInt();
while(T > 0) {
N = inputProcessor.nextInt();
long result = 0L;
for(int i = 0; i <= 9; i++) {
result += DP[N][i];
}
sb.append(result).append("\n");
T -= 1;
}
output();
}
private static void preprocess() {
DP = new long[65][10];
Arrays.fill(DP[1], 1);
bottomUp();
}
private static void bottomUp() {
for(int len = 2; len <= 64; len++) {
for(int i = 0; i <= 9; i++) {
for(int j = 0; j <= i; j++) {
DP[len][i] += DP[len - 1][j];
}
}
}
}
private static void output() throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static class InputProcessor {
BufferedReader br;
StringTokenizer st;
public InputProcessor() {
this.br = new BufferedReader(new InputStreamReader(System.in));
}
public String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return st.nextToken();
}
public String nextLine() {
String input = "";
try {
input = br.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
return input;
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
}
}
(2) Top-Down 방식
import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static InputProcessor inputProcessor = new InputProcessor();
static int T, N;
static long[][] DP;
public static void main(String[] args) throws IOException {
pro(); // top-down 초기화
T = inputProcessor.nextInt();
while(T > 0) {
N = inputProcessor.nextInt();
long result = 0L;
for(int i = 0; i <= 9; i++) {
result += topDown(N, i);
}
sb.append(result).append("\n");
T -= 1;
}
output();
}
private static void pro() {
DP = new long[65][10];
Arrays.fill(DP[1], 1);
}
private static long topDown(int n, int idx) {
if(DP[n][idx] != 0) return DP[n][idx];
for(int k = 0; k <= idx; k++) {
DP[n][idx] += topDown(n - 1, k);
}
return DP[n][idx];
}
private static void output() throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(sb.toString());
bw.flush();
bw.close();
}
private static class InputProcessor {
BufferedReader br;
StringTokenizer st;
public InputProcessor() {
this.br = new BufferedReader(new InputStreamReader(System.in));
}
public String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return st.nextToken();
}
public String nextLine() {
String input = "";
try {
input = br.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
return input;
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {
return Long.parseLong(next());
}
}
}
반응형
'알고리즘 > 동적 프로그래밍' 카테고리의 다른 글
[BOJ 15990] 1, 2, 3 더하기 5 (Java, DP) (0) | 2023.07.10 |
---|---|
[BOJ 15988] 1, 2, 3 더하기 3 (Java, DP) (0) | 2023.07.10 |
[BOJ 1495] 기타리스트 (Java, DP) (0) | 2023.07.10 |
[BOJ 5557] 1학년 (Java, DP) (0) | 2023.07.10 |
[BOJ 2193] 이친수 (Java, DP) (0) | 2023.07.10 |
@leejinwoo1126 :: 천천히 하나씩
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!