알고리즘
백준 2688번 줄어들지 않아 (JAVA)
박카스마시며코딩
2022. 7. 27. 20:41
https://www.acmicpc.net/problem/2688
2688번: 줄어들지 않아
첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 1,000)이 주어진다. 각 테스트 케이스는 숫자 하나 n으로 이루어져 있다. (1 <= n <= 64)
www.acmicpc.net
저는 DP를 이용해 해당 문제를 해결하였습니다.
num은 해당 자리 수를 뜻하며, 저는 두번째 인덱스로 맨 앞 숫자를 표현하고 이에 대한 개수를 저장하였습니다.
마지막으로 10은 num에 해당하는 자리 수의 결과 값입니다.
package BOJ.dp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_2688 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
int test = stoi.apply(br.readLine());
long[][] dp = new long[64 + 1][10 + 1];
for(int i = 0 ; i < 10 ; i++){
dp[1][i] = 1;
}
dp[1][TOTAL_SUM_INDEX] = 10;
for(int t = 0 ; t < test ; t++){
int num = stoi.apply(br.readLine());
System.out.println(cal(num,dp));
}
}
private static final long NOT_VALID = 0;
private static final int TOTAL_SUM_INDEX = 10;
private static long cal(int num, long[][] dp) {
if(dp[num][TOTAL_SUM_INDEX] != NOT_VALID){
return dp[num][TOTAL_SUM_INDEX];
}
if(dp[num-1][TOTAL_SUM_INDEX] == NOT_VALID){
cal(num-1,dp);
}
for(int i = 0 ; i < 10 ; i++){
for(int j = i ; j < 10 ; j++){
dp[num][i] += dp[num-1][j];
dp[num][TOTAL_SUM_INDEX] += dp[num-1][j];
}
}
return dp[num][TOTAL_SUM_INDEX];
}
}