반응형
솔직히 연속합 전까지는 DP가 너무 쉬워서 물로만 느꼈었는데...
슬슬 골드 단계까지 오니까 굉장히 어려운 문제라는 걸 뼈저리게 느끼고 있다...
N=1
K=1: 1
K=2: 01 10
K=3: 001 010 100
N=2
K=1: 2 // dp[2][1]
K=2: 02 20 11 // dp[2][1] + dp[1][2]
K=3: 002 020 200 110 101 011 // dp[2][2]+dp[1][3]
N=3
K=1: 3 // dp[3][1]
K=2: 03 30 12 21 // dp[3][1] + dp[2][2]
K=3: 003 030 300 012 102 120 021 201 210 111 // dp[3][2] + dp[2][3]
N=6
K=1: 6
K=2: 06 60 15 51 24 42 33
K=3: 006 060 600 150 105 015 510 501 051 240 204 024 420 402 042 330 303 033
솔직히 이 문제는 도저히 알고리즘이 생각이 안 나서... 위와 같이 그냥 N이랑 K를 직접 돌려보면서 점화식을 직접 도출해냈다.
아직 원리도 잘 모르겠지만... 점화식 도출하고 문제 풀 수만 있었으면 됐지 머 ㅋㅋ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class SumDecomposition {
public static int stoi(String str) {
return Integer.parseInt(str);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[][] dp = new int[N+1][K+1];
for (int i=1; i<=K; i++) {
dp[1][i] = i;
}
for (int i=1; i<=N; i++) {
dp[i][1] = 1;
}
for (int i=2; i<=N; i++) {
for (int j=2; j<=K; j++) {
dp[i][j] = (dp[i][j-1] + dp[i-1][j]) % 1000000000;
}
}
System.out.println(dp[N][K]);
}
}
로그인
www.acmicpc.net
'컴퓨터 공학 > 백준' 카테고리의 다른 글
[백준] JAVA 자바 : 동물원 (1309번) (0) | 2024.01.23 |
---|---|
[백준] JAVA 자바 : RGB거리 (1149번) (0) | 2024.01.23 |
[백준] JAVA 자바 : 연속합 (1912번) (0) | 2024.01.23 |
[백준] JAVA 자바 : 가장 긴 증가하는 부분 수열 4 (14002번) (0) | 2024.01.23 |
[백준] JAVA 자바 : 카드 구매하기 2 (16194번) (1) | 2024.01.23 |