:: ADVANCE ::
[BaekJoon][2591] 숫자카드 본문
반응형
BAEKJOON ONLINE JUDGE
한국정보올림피아드 시.도 지역본선 2005
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