반응형

문제 출처 :


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



알고리즘 분석 :


문제 해결에 필요한 사항

1. Dynamic Programming

2. 경우의 수


타일링 문제에서 타일이 총 3가지가 주어졌다.


아래의 파란 부분을 마지막으로 채우기 위해서는 앞에서 어떤 작업이 이루어 져야할지 생각해 봐야한다.


첫번째 세로로 긴 타일 한장을 놓는 경우를 보자.


빨간 동그라미 부분은 어떻게 쌓여오든 관계없다 생각하고 세로로 긴 타일을 한장 놓고, 마무리를 하면된다.


이 과정은 곧 DP[i-1]이 될 것이다.


그리고 그 2번째, 3번째 그림을 보면 두칸 전부터 해결하고 있다.


두칸 전부터 정사각형을 하나 놓으면 되고, 아니면 가로로 긴 타일을 2장 놓으면 된다.


즉, 이 과정은 DP[i-2] * 2가 될것이다. 









소스 코드 : 


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
27
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main()
{
 
    int n, i;
    long long int dp[1001];
 
    dp[0= 1;
    dp[1= 1;
    dp[2= 3;
 
    scanf("%d"&n);
 
    for (i = 3; i <= n; i++)
    {
        dp[i] = (dp[i-1+ dp[i - 2]*2) % 10007;
    }
    printf("%lld", dp[n]);
 
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocu


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[10819번] 차이를 최대로  (0) 2016.11.08
[2166번] 다각형의 면적  (2) 2016.11.07
[1707번] 이분 그래프  (0) 2016.11.07
[13567번] Robot  (0) 2016.11.07
[13414번] 수강신청  (0) 2016.11.06