728x90
다이나믹 프로그래밍 문제입니다.
2xn 직사각형을 2x1과 2x2타일로 채우는 방법의 수를 구하는 문제입니다.
1. i-1칸 까지 채운 상태에서 2x1 세로타일을 채우는 경우
2. i-2칸 까지 채운 상태에서 2x1 가로타일을 위아래로 채우는 경우
3. i-2칸 까지 채운 상태에서 2x2 정사각형타일을 채우는 경우
를 식으로 변경하면
memo[i] = memo[i-1] + (memo[i-2] * 2) 가 됩니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
int n;
int memo[1000];
cin >> n;
memo[0] = 0;
memo[1] = 1;
memo[2] = 3;
for (int i = 3; i <= n; ++i) {
memo[i] = (memo[i - 1] + memo[i - 2] * 2) % 10007;
}
cout << memo[n];
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 2577번 숫자의 개수 (0) | 2019.05.19 |
---|---|
[C++] 백준 1978번 소수 찾기 (0) | 2019.05.19 |
[C++] 백준 10844번 쉬운 계단 수 (0) | 2019.05.18 |
[C++] 백준 1912번 연속합 (0) | 2019.05.17 |
[C++] 백준 2156번 포도주 시식 (0) | 2019.05.17 |