https://www.acmicpc.net/problem/2133
2133번: 타일 채우기
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.
www.acmicpc.net
문제
3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.
입력
첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다.
출력
첫째 줄에 경우의 수를 출력한다.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N;
cin >> N;
vector<int> dp(N+1, 0);
dp[0] = 1;//2x0의 공간을 채울 수 있는 경우의 수는 1개
dp[2] = 3;//2x2의 공간을 채울 수 있는 경우의 수는 2개
for (int i = 4; i <= N; i = i + 2)
{
dp[i] = dp[i - 2] * 3;
for (int j = 0; j < i-2; j=j+2)
{
dp[i] = dp[i] + dp[j]*2;
}
}
cout << dp[N];
}
dp[2] 는 다음과 같이 3개이다
dp[4]는 dp[2] 3가지에 더해서 또 위와같이 3가지 경우의 수가 더 올 수 있으므로 3 x 3 이다.
그러나 dp[4]의 경우 그 고유한 배열을 2가지 가지고 있다.
위의 2가지 경우를 더해 dp[4] = 11이 된다.
dp[6]의 경우
dp[4]에 3x2 칸이 올 경우의 수(3)를 곱해준값 +
dp[2] 에 3x4의 고유한 배열이 올 경우의 수 (2)를 곱해준 값 +
dp[6]의 고유의 값
이 될 것이다.
즉 dp[6] = dp[4] x 3 + dp[2] x 2 + 1 x 2
= dp[4] x 3 + dp[2] x 2 + dp[0] x 2
'백준 c++ > (1-1)백준 c++ 알고리즘 기초' 카테고리의 다른 글
백준 10430 c++ 나머지 (0) | 2022.07.29 |
---|---|
백준 17404 c++ RGB거리 2 (0) | 2022.07.28 |
백준 13398 c++ 연속합 2 (0) | 2022.07.27 |
백준 11054 c++ 가장 긴 바이토닉 부분 수열 (0) | 2022.07.27 |
백준 11722 c++ 가장 긴 감소하는 부분 수열 (0) | 2022.07.27 |