:: ADVANCE ::

[BaekJoon][2591] 숫자카드 본문

Algorithm/DP (동적계획법)

[BaekJoon][2591] 숫자카드

KSJ14 2016. 9. 5. 01:07
반응형

BAEKJOON ONLINE JUDGE

 

한국정보올림피아드 시.도 지역본선 2005

 

2591 숫자카드

 

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

 

 

 

DP

dp <- index번째 수를 마지막으로 만들 수 있는 카드의 경우의 수

 

dp[0] = 1;

dp[i] = input[i]가 0이 아니면 dp[i - 1]   -->  이전까지 배치된 카드에 새로 추가된 수(한자리) 카드를 놓으면 된다.
10 <= input[i] * 10 + input[i + 1] <= 34 이면 dp[i - 2]  --> i번째와 i + 1번째 수를 사용해서 10이상, 34이하의 카드를 만들 수 있으면 그 이전까지 만든 카드에 두 수를 합친 카드를 놓으면 된다.

 

원리는 위와 같고, bottom up 방식으로 구현을 하였고, i - 1에서 가져오는 것이 아니라 i를 i + 1, i + 2에 넣는 방식으로 구현하였다.

 

아래 코드에서 input[i]번째의 수와 매칭되는 dp index는 i + 1이다. 이는 손으로 직접 코드를 살펴보면 알 수 있을 것이다.

 

 

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
int dp[45];
char input[45];
 
int main()
{
    int i;
 
    scanf("%s", input);
 
    dp[0= 1;
    for (i = 0; input[i]; i++) {
        input[i] -= '0';
        if (input[i]) {
            dp[i + 1+= dp[i];
            if (input[i] * 10 + input[i + 1- '0' <= 34)
                dp[i + 2+= dp[i];
        }
    }
 
    printf("%d\n", dp[i]);
 
    return 0;
}
 
cs

 

반응형

 

반응형

'Algorithm > DP (동적계획법)' 카테고리의 다른 글

[BaekJoon][11052] 붕어빵 판매하기  (0) 2016.09.26
[BaekJoon][11507] 오르막 수  (0) 2016.09.22
[BaekJoon][2184] 김치 배달  (0) 2016.09.04
[BaekJoon][11726] 2xn 타일링  (0) 2016.07.11
[BaekJoon][11048] 이동하기  (0) 2016.07.11
Comments