Algorithm/Algorithm 문제 풀이
[BAE/<JOON> 문제풀이] 2133. 타일 채우기 (DP.028)
폭풍저그머성찡
2020. 5. 5. 21:15
https://www.acmicpc.net/problem/2133
2133번: 타일 채우기
문제 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자. 입력 첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다. 출력 첫째 줄에 경우의 수를 출력한다. 예제 입력 1 복사 2 예제 출력 1 복사 3 힌트 아래 그림은 3×12 벽을 타일로 채운 예시이다....
www.acmicpc.net
5항까지 수기계산하고 규칙찾는데 규칙이 5~6개는 나왔다.
6항부터는 수기계산이 힘들어서 그냥 채점 박치기 했다.
이런거 대회문제에 나오면 시간 진짜 많이 잡아먹힐거 같다.
더보기
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
if (n % 2 == 1) {
cout << 0;
return 0;
}
n /= 2;
vector<unsigned long long> arr;
vector<unsigned long long> m;
arr.resize(n + 1);
m.resize(n + 3);
arr[0] = 1;
arr[1] = 3;
m[0] = 1;
m[1] = 1;
m[2] = 1;
for (int i = 3; i <= n; i++) {
m[i] = m[i - 1] + m[i - 2] + 1;
}
for (int i = 2; i <= n; i++) {
//arr[i] = (arr[i - 1] + arr[i - 2]) * 3 - m[i - 1];
arr[i] = arr[i - 1] * 3 + (arr[i - 1] - arr[i - 2]);
}
cout << arr[n];
return 0;
}