본문 바로가기

Notice
Recent Posts
Recent Comments
«   2024/05   »
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 28 29 30 31
Tags
더보기
Archives
관리 메뉴

11727. 2×n 타일링 2 본문

알고리즘 문제풀기/백준(Acmicpc)

11727. 2×n 타일링 2

알광(Algwang) 2019. 1. 15. 10:35

문제링크 : https://www.acmicpc.net/problem/11727


< 입력 >


길이 n이 주어진다.


< 출력 >


2 x n 크기의 직사각형을 채우는 방법의 수 (%10,007)


< 풀이 >


계단을 1칸 2칸씩 오를 때의 경우의 수와 같은 전형적인 dp문제이다.


따라서 (2 x (n-1))의 경우와 (2 x (n-2))의 경우를 더해주면 된다.


여기서 주의해야할 점은 (2 x (n-1))의 경우를 2번 더해줘야 한다는 점이다. (즉, x 2)


이유는 2 x n 크기의 직사각형을 채울 수 있는 방법을 시뮬레이션 해보면 알 수 있다.



위 사진에서 ?가 그려진 직사각형을 2 x n 크기로 보자.


그러면 아래 그림처럼 1칸 적은 직사각형에서 2 x 1을 더하는 경우와


2칸 적은 직사각형에서 2 x 2, 1 x 2(2개) 를 더하는 경우가 있다.


a_1 = 1, a_2 = 3으로 초기화한 상태에서 a_n = a_(n-1) + (a_(n-2) * 2) 의 점화식을 세울 수 있다.



- 소스 코드 -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
 
using namespace std;
 
int main(void){
    int dp[1001]={0};
    int n;
    cin>>n;
    dp[1]=1;
    dp[2]=3;
 
    for(int i=3;i<=n;i++){
        dp[i]=((dp[i-2]*2)+dp[i-1])%10007;
    }
 
    cout<<dp[n]<<endl;
}
cs




'알고리즘 문제풀기 > 백준(Acmicpc)' 카테고리의 다른 글

10164. 격자상의 경로  (0) 2019.01.17
14720. 우유 축제  (0) 2019.01.15
1967. 트리의 지름  (0) 2019.01.14
1008. A/B  (0) 2018.12.30
3111. 검열 ( 오답노트 )  (0) 2018.12.20
Comments