728x90
https://www.acmicpc.net/problem/11057
dp테이블
자릿수, 자릿값을 가지고 있어야 한다.
-> dp[자릿수][자릿값]
접근
static int L(int n, int i) {
if (dp[n][i] != 0) {
return dp[n][i];
}
if (i == 0) {
dp[n][i] = L(n - 1, i);
} else {
for (int j = i; j >= 0; j--) {
dp[n][i] += L(n - 1, j);
}
}
return dp[n][i] % divVal;
}
현재 자릿값보다 작은 직전 자릿수의 자릿값을 더하는 식
반복문을 없애고 아래와 같은 식을 쓸 수 있다.
static int L(int n, int i) {
if (dp[n][i] != 0) {
return dp[n][i];
}
if (i == 0) {
dp[n][i] = L(n - 1, i);
} else {
dp[n][i] += L(n - 1, i) + L(n , i - 1);
}
return dp[n][i] % divVal;
}
점화식
자바 코드 01. 재귀
package main.iyk2h;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[][] dp;
final static int divVal = 10_007;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
dp = new int[n + 1][10];
for (int i = 0; i < 10; i++) {
dp[1][i] = 1;
}
int result = 0;
for (int i = 0; i < 10; i++) {
result += L(n, i);
}
for (int i = 1; i <=n; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(dp[i][j]+ " ");
}
System.out.println();
}
System.out.println(result % divVal);
}
static int L(int n, int i) {
if (dp[n][i] != 0) {
return dp[n][i];
}
if (i == 0) {
dp[n][i] = L(n - 1, i);
} else {
dp[n][i] += L(n - 1, i) + L(n , i - 1);
}
return dp[n][i] % divVal;
}
}
자바 코드 02. 재귀 + 반복문
package main.iyk2h;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[][] dp;
final static int divVal = 10_007;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
dp = new int[n + 1][10];
for (int i = 0; i < 10; i++) {
dp[1][i] = 1;
}
int result = 0;
for (int i = 0; i < 10; i++) {
result += L(n, i);
}
System.out.println(result % divVal);
}
static int L(int n, int i) {
if (dp[n][i] != 0) {
return dp[n][i];
}
if (i == 0) {
dp[n][i] = L(n - 1, i);
} else {
for (int j = i; j >= 0; j--) {
dp[n][i] += L(n - 1, j);
}
}
return dp[n][i] % divVal;
}
}
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준] 9465 스티커 자바(Java) (0) | 2023.01.06 |
---|---|
[백준] 2193 이친수 자바(Java) (0) | 2023.01.05 |
[백준] 10844 쉬운 계단 수 자바(Java) (0) | 2023.01.02 |
[백준] 9095 1, 2, 3 더하기 자바(Java) (0) | 2023.01.01 |
[백준] 11727 2xn 타일링 2 자바(Java) (0) | 2023.01.01 |
댓글