-
[KOITP] 합분해자료구조 및 알고리즘/문제풀이 2017. 1. 9. 19:06
출 처 : http://koitp.org/problem/SDS_PRO_2_2/read/
시간 제한 메모리 제한 제출 횟수 정답 횟수 (비율) 정답자 수 1.0 초 512 MB 1982 628 (32%) 529 < Comment >
이번에도 점화식도 동일하게 세웠었으나, 기저케이스에 대한 명확한 정의를 하지 않고 진행하여, 결국 답안을 보고 틀린 점을 찾아내었습니다. 다른 부분은 크게 문제가 없었으나 N의 범위를 0부터로 지정하지 않나, 계산하는 과정에서 오차가 생겼던 것으로 보입니다. 이 전에 풀었던 풀이도 별해와 크게 다르지 않았는데, 조합을 이용하여 N+K-1 개 중에 K-1개를 고르는 경우의 수와 동일했습니다. 수들 사이에 칸막이를 넣어둔다는 생각은 동일했으나, 제가 처음에 풀었을때 N+1개 중에 골라야한다고 단순하게 중복없이 생각하여 문제가 풀리지 않았었습니다. 속도는 조합을 이용하는 방법이 더 빠르다고 합니다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.StringTokenizer; public class DevideSum { public static int N = 0; public static int K = 0; public static double dp[][] = new double[202][202]; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); dp[0][0] = 1; for (int i = 0 ; i <= N ; i++) { for (int j = 1 ; j <= K ; j++) { for (int k = 0 ; k <= i ; k++) { dp[i][j] = (dp[i][j] + dp[i-k][j-1]) % 1000000000; } } } bw.write("" + String.format("%.0f",dp[N][K])); bw.flush(); bw.close(); } }