티스토리 뷰

반응형

백준 2133 타일채우기

해설

흥미로운 문제이다. 정답을 미리 알거나 스포일링 당하는건 괴롭지만, ... 생각해나갈 때는 알쏭달쏭한 즐거운 문제였을 것이다.(구현문제보단 재밌는듯)

가로 길이 2 인 것을 만드는 경우의 수는 3가지이다. ( ||_ ),( _|| ), ( _ _ _ )이다.
임의의 길이 i를 만드는 데에는 i-2 길이를 만드는 경우의 수에 3가지 경우의 수를 조합하는 것이므로, f(i) = f(i-2)*2 이다.

그리고, 길이 4 이상부터 다음과 같은 형태를 만들 수 있다.
.

이러한 형태는 4, 6, 8, ... i 길이 만큼 만들 수 있고, 뒤집은 형태도 있기 때문에 각 길이마다 2가지의 경우의 수가 있다.
이를 종합하면 i를 만드는 경우의 수는 다음과 같다.
f(i) = f(i-2)*2 + f(j)*2, where j= i-4, i-6, ... 0.

````C++

#include

using namespace std;
int d[31];
int main()
{ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

d[0]=1;
d[2] = 3;

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

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

int n;
cin >> n;
cout << d[n] << "\n";

} `

반응형

'알고리즘 문제 > DP' 카테고리의 다른 글

백준 14494 다이나믹이 뭐에요?  (0) 2019.09.17
백준 1463 1로 만들기  (0) 2019.09.17
백준 15483 최소편집  (0) 2018.12.30
백준 15991 1, 2, 3 더하기 - 6  (0) 2018.10.23
백준1126 같은탑  (0) 2017.12.05