본문 바로가기
Problem Solving/BOJ

[Python]2225. 합분해

by 부르르 2019. 4. 8.

https://www.acmicpc.net/problem/2225

 

2225번: 합분해

첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net


2차원 DP로 접근하면 쉽게 해결할 수 있는 문제였다.

조건에서 0<=K<=N 이며 여러번 중복해서 사용할 수 있고 순서가 다르면 다른 경우로 친다고 하였다.

K와 N이 어떤 관계인지 도식화해서 알아보자

 

 

K=3 일때 N=2 인 경우를 만들기 위해선 K=2 일때 i=0, 1, 2 의 경우를 모두 참조하고 끝에다가 (N-i) 을 더하는 것을 볼 수 있다.

정리하자면, DP[K][N] = DP[K-1][0] + DP[K-1][1]+ ... + DP[K-1][N] 인 형태이다.

 

코드는 다음과 같다. 복잡도는 K*N^2 이다.

1
2
3
4
5
6
7
8
9
10
n, k = map(int,input().split())
mod = 1000000000
dp = [[0]*(n+1for _ in range(k+1)]
dp[0][0= 1
for i in range(1, k+1):
    for j in range(n+1):
        for l in range(j+1):
            dp[i][j] += dp[i-1][j-l]
        dp[i][j] %= mod
print(dp[k][n])
cs

 

위 성질을 이용해 복잡도를 KN 까지 낮춰보자

DP[K][N-1] = DP[K-1][0]+DP[K-1][1]]+...+DP[K-1][N-1] 이므로

DP[K][N] = DP[K-1][0]+DP[K-1][1]]+...+DP[K-1][N-1]+DP[K-1][N]

                   = DP[K][N-1]+DP[K-1][N] 

1
2
3
4
5
6
7
8
9
n, k = map(int,input().split())
mod = 1000000000
dp = [[0]*(n+1for _ in range(k+1)]
dp[0][0= 1
for i in range(1, k+1):
    for j in range(n+1):
        dp[i][j] = dp[i-1][j] + dp[i][j-1]
        dp[i][j] %= mod
print(dp[k][n])
cs
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]17136. 색종이 붙이기  (0) 2019.04.08
[Python]1107. 리모컨  (0) 2019.04.08
[Python]1699. 제곱수의 합  (0) 2019.04.07
[Python]17135. 캐슬 디펜스  (0) 2019.04.07
[Python]13398. 연속합 2  (0) 2019.04.07

댓글