[BOJ 2688] 줄어들지 않아 (Java, DP)알고리즘/동적 프로그래밍2023. 7. 4. 12:48
Table of Contents
반응형
문제 링크
https://www.acmicpc.net/problem/2688
문제 풀이
- 초기 DP배열을 구하는데 시간복잡도 O(64 * 10 * 10)
- 문제 지문 "어떤 숫자가 줄어들지 않는다는 것은 그 숫자의 각 자리 수보다 그 왼쪽 자리 수가 작거나 같을 때 이다."에 따라 00, 01, 02와 같은 형태의 숫자 개수를 찾음
- DP[2][1] 은 2자리 수이면서 시작이 1인 줄어들지 않는 수를 뜻함
초기화 DP[1][i]의 경우 모두 1 (해당 문제에서 0또한 포함)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
DP[1] | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
DP[2] | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
아래와 같이 값이 구해진다
DP[2][0] 의 경우 00 ~ 09
DP[2][1] 의 경우 11 ~ 19
DP[2][2] 의 경우 22 ~ 29
..
DP[2][9] 의 경우 99
0~10까지의 합 = N ( N + 1 ) / 2 = 55
제출 코드
import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int T, N;
static long[][] DP;
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
while(T > 0) {
T -= 1;
N = Integer.parseInt(br.readLine());
sb.append(sumValue(N)).append("\n");
}
}
static long sumValue(int n) {
long result = 0L;
for(long v : DP[N]) {
result += v;
}
return result;
}
static void preProcess() {
DP = new long[65][10];
for(int i = 0; i <= 9; i++) DP[1][i] = 1;
for(int i = 2; i <= 64; i++) {
for(int j = 0; j <= 9; j++) {
for(int k = j; k <= 9; k++) {
DP[i][j] += DP[i - 1][k];
}
}
}
}
public static void main(String[] args) throws Exception {
preProcess();
input();
System.out.println(sb);
}
}
반응형
'알고리즘 > 동적 프로그래밍' 카테고리의 다른 글
[BOJ 2096] 내려가기 (Java, DP, 슬라이딩 윈도우) (0) | 2023.07.07 |
---|---|
[BOJ 1562] 계단수 (Java, DP, Bit Masking) (0) | 2023.07.04 |
[BOJ 9465] 스티커 (Java, DP) (0) | 2023.07.04 |
[BOJ 9095] 1,2,3 더하기 (Java, DP) (0) | 2023.07.03 |
[BOJ 1149] RGB거리 (Java, DP) (0) | 2023.07.03 |
@leejinwoo1126 :: 천천히 하나씩
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!