알고리즘

[C++] 백준 2133번 타일 채우기

J3SUNG 2019. 5. 30. 20:27
728x90

 

다이나믹 프로그래밍 문제입니다.

 

3*n의 사각형에 타일을 채울 때 경우의 수를 구하는 문제입니다.

 

1) n이 홀수이면 경우의수는 0입니다.

2) n이 2일때 3가지 경우의 수가 있습니다.

3) 그리고 n이 4일때는 2가지 경우의 수가 늘어나게 됩니다.

 

1~3의 코드는 다음과 같습니다.

 

1)

if (n % 2 == 1) {
 	cout << "0" << endl;
 	return 0;
}

 

2), 3)

for (int i = 4; i <= n; i += 2) {
 	memo[i] = memo[i - 2] * 3;            // 2)

 	for (int j = 4; i - j >= 0; j += 2) {
 		memo[i] += memo[i - j] * 2;   // 3)
 	}
}

 

#include <iostream>
using namespace std;

int memo[40] = {0, };

int main(int argc, char *argv[])
{
   int n;
   int result = 0;

   cin >> n;
   
   memo[0] = 1;
   memo[2] = 3;

   if (n % 2 == 1) {
      cout << "0" << endl;
      return 0;
   }

   for (int i = 4; i <= n; i += 2) {
      memo[i] = memo[i - 2] * 3;

      for (int j = 4; i - j >= 0; j += 2) {
         memo[i] += memo[i - j] * 2;
      }
   }

   cout << memo[n] << endl;
   return 0;
}