11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
간단한 DP 문제였다. 피보나치 수열과 비슷한(거의 같은) 점화식으로 풀 수 있다.
2 x n 타일을 채우는 경우의 수는 타일 가장 오른쪽을 세로블록 한개로 채우는 경우의 수와 가로블록 두개로 채우는 경우의 수의 합과 같기 때문이다.
따라서 점화식은 dp(n) = dp(n-1) + dp(n-2) 이며,
기저사례로 n == 1일 때 1을 반환, n == 2일 때 2를 반환하여 횟수를 카운팅 해주면 쉽게 원하는 결과를 얻을 수 있다.
#include <iostream>
#include <cstring>
using namespace std;
int memo[1001];
int Solution(int n)
{
if (n == 1) return 1;
if (n == 2) return 2;
int& ret = memo[n];
if (ret != -1) return ret;
return ret = (Solution(n - 1) + Solution(n - 2)) % 10007;
}
int main(void)
{
memset(memo, -1, sizeof(memo));
int n;
cin >> n;
cout << Solution(n) << endl;
return 0;
}
알고리즘 200일 프로젝트 - 63 day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2579번: 계단 오르기 (0) | 2020.06.08 |
---|---|
백준 1149번: RGB거리 (0) | 2020.06.08 |
백준 1003번: 피보나치 함수 (0) | 2020.06.07 |
백준 9095번: 1, 2, 3 더하기 (0) | 2020.06.07 |
백준 1463번: 1로 만들기 (0) | 2020.06.07 |