https://www.acmicpc.net/problem/2133
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 변수 선언, 입력
int const MAX = 30;
int const len2 = 3;
int tiles[MAX + 1] = {0, };
int n;
cin >> n;
/*
점화식
D[i] : 3 * i 를 1*2, 2*1로 채우는 방법의 수
Type 1 : 3*2를 채우는 방법
Type 2 : 각 길이에 2개씩 방법이 더 있다
--> D[i] = D[i - 2] * 3 + D[i - 4] * 2 + D[i - 6] * 2 ...
*/
tiles[0] = 1;
for (int i = 2; i <= n; i += 2)
{
tiles[i] = tiles[i - 2] * len2;
for (int j = i - 4; j >= 0; j -= 2)
{
tiles[i] += tiles[j] * 2;
}
}
cout << tiles[n];
return 0;
}
Colored by Color Scripter
|
처음에 너무 복잡하게 생각해서 D[i][j]로 이차원 배열을 만들다가 망했다.
D[i]을 그림으로 표현하자면 다음과 같다.
그림을 그려가다보면 4, 6 ... 번째에 생기는 특이한 그림이 있다.
저런거/뒤집은거 해서 2개씩 생긴다.
그걸 차차 더해주면 됨..
그림으로 나타내면 아래와 같다.
홀수번째는 만들수 없다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]1918번: 후위 표기식(c++) (0) | 2020.04.24 |
---|---|
[BOJ]1935번: 후위 표기식2(c++) (0) | 2020.04.24 |
[BOJ]13398번: 연속합 2(c++) (0) | 2020.04.23 |
[BOJ]11054번: 가장 긴 바이토닉 부분 수열(c++) (0) | 2020.04.23 |
[BOJ]11722번: 가장 긴 감소하는 부분 수열(c++) (0) | 2020.04.23 |
댓글