2024. 10. 3. 20:20ㆍAlgorithm
1. problem :
https://www.acmicpc.net/problem/2133
2. solution 1 :
#include <bits/stdc++.h>
using namespace std;
int d[33];
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
d[0] = 1, d[2] = 3;
for (int i = 3; i <= n; i++) {
d[i] += d[i - 2] * 3;
for (int j = i - 4; j >= 0; j -= 2) {
d[i] += d[j] * 2;
}
}
cout << d[n];
}
source code 출처 : https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x10/solutions/2133.cpp
basic-algo-lecture/0x10/solutions/2133.cpp at master · encrypted-def/basic-algo-lecture
바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.
github.com
dp를 이용해 풀었다. 따라서, 세 가지 스텝을 따른다.
1. 테이블을 정의한다. d[i] = 가로길이가 i일 때의 경우의 수
2. 점화식을 작성한다. d[i] = d [i-2] * 3 + (d [i-4] + d [i-6] +... + d [i-k]) * 2 (단 i - k >= 0)
3. 초기값을 설정한다. d[0] = 1, d [2] = 3
2번이 핵심이다. 왜 저런식이 나올까?
일단, d[i-2] * 3인 이유는 홀수일 때는 0이기 때문에 신경 쓰지 않고, 짝수일 때만 고려하면 된다. 따라서, i-2번째 block에 d [2] 값을 곱해주면 된다. 따라서, d [2] = 3이기 때문에, 3을 곱해준다. 그 뒤에 식은 특수패턴의 처리이다.
d [4]일 때부터 특수패턴이 나온다. 이때, 특수패턴은 가로길이가 4인 특수패턴이다. 이 특수패턴은 1*2블록만을 사용하여 윗변 또는 밑변을 구성할 때 나타난다. 따라서, 2가지 특수패턴이 있다. 여기서 더 나아가, d [6]일 때는 가로길이가 6인 특수패턴과 가로길이가 4인 특수패턴을 가질 수 있다. 이때도 마찬가지로, 가로길이가 6인 특수패턴은 2가지가 나온다.
따라서, d[6] = d [4] * 3 + d [2] * 2 + d [0] * 2로 표현할 수 있다.
'Algorithm' 카테고리의 다른 글
[BOJ] 1520번 : 내리막 길 (0) | 2024.10.05 |
---|---|
[BOJ] 1476번 : 날짜 계산 (0) | 2024.10.04 |
[BOJ] 9613번 : GCD 합 (0) | 2024.10.03 |
[BOJ] 2294번 : 동전 2 (0) | 2024.10.03 |
[BOJ] 1676번 : 팩토리얼 0의 개수 (0) | 2024.10.02 |