11726번: 2×n 타일링

문제:

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

입력:

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

풀이:

코드:

#include <iostream>

using namespace std;

int d[1001]; //바텀업인경우 = {0,1,2}

//탑다운 방식의 재귀 함수
int dp(int n){
	if(n==1) return 1; //1칸인 경우 경우의 수 1개
	if(n==2) return 2; //2칸인 경우 경우의 수 2개
	if(d[n]) return d[n]; //이미 값이 존재할 경우 배열에서 찾아옴
	return d[n] = (dp(n-1)+dp(n-2))%10007; //한칸인 경우와 두칸인 경우로 나눠 경우의 수 확인

}

int main(void){
	int n;
	//입력
	cin >> n;

	/* 바텀업 방식
	for(int i = 3; i<=n; i++){
		d[i] = (d[i-1]+d[i-2])%10007; //한칸인 경우와 두칸인 경우로 나눠 경우의 수 확인
	}
	cout<<d[n];
	*/

	//출력
	cout<<dp(n);
	
}