728x90
타일 채우기
https://www.acmicpc.net/problem/2133
<코드>
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 | #include <stdio.h> int main(void){ int Dp[31] = {}; int result[31] = {}; int K; Dp[0] = 1; result[0] = 1; Dp[2] = 3; for (int i = 4; i <= 30; i += 2) Dp[i] = 2; scanf("%d", &K); for (int i = 2; i <= K; i+=2){ for (int j = 2; j <= i; j += 2){ result[i] += Dp[j] * result[i - j]; } } printf("%d\n", result[K]); return 0; } | cs |
<문제 푼 요령>
1. 타일이 만들어 질 수 있는 경우는 짝 수 일때 뿐이다.
2. 타일이 추가될 때의 경우를 생각해 보자. 예를 들어
-2 개일 때 : 3개이다.
-4 개일 때 : 앞이 2개로 만들 수 있는 경우 * 4-2개로 만들 수 있는 경우 + 4개로만 만들 수 있는 경우 * 4-4개로 만들 수 있는 경우
-6 개일 때 : 앞이 2개로 만들 수 있는 경우 * 6-2개로 만들 수 있는 경우 + 앞이 4개로만 만들 수 있는 경우 * 6-4개로 만들 수 있는 경우 + 앞이 6개로만 만들 수 있는 경우 * 6-6개로 만들 수 있는 경우
3. 위에 껄로 보면 과거의 것으로 새롭게 만드는 것과 자기 자신의 숫자만큼 유일하게 만들 수 있는 경우를 더하면 되는 것이다.
4. 그렇게 진행하면 마지막에 K에 들어오는 값이 만들 수 있는 타일의 수가 된다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][11726번][DP] 2xn 타일링 (2) | 2016.04.12 |
---|---|
[백준][1463번][DP] 1로 만들기 (1) | 2016.04.12 |
[백준][1520번][DP] 내리막길 (8) | 2016.04.12 |
[백준][9465번][DP] 스티커 (1) | 2016.04.12 |
[Dovelet][DP] 01knapsack (0) | 2016.04.12 |
댓글