문제) 백준 - 동적 계획법 1(Dynamic programming)- 01타일
-> www.acmicpc.net/problem/1904
1904번: 01타일
지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이
www.acmicpc.net
dp | 가능한 숫자 | ||||
dp[1] | 1 | ||||
dp[2] | 11 | 00 | |||
dp[3] | 111 | 001 | 100 | ||
dp[4] | 1111 | 0011 | 1001 | 1100 | 0000 |
... | |||||
dp[n] | dp[n - 1] | ... | dp[n - 2] |
n을 숫자의 길이, dp[n]에 해당하는 값을 가능한 숫자의 개수라 하자.
'00' 타일과 '1' 타일을 붙이는데 별 다른 제약 조건이 없다. dp[n]은 dp[n - 2]에 '00' 타일을 붙여 만들 수 있고, dp[n - 1]에 '1' 타일을 붙여 만들 수 있다.
따라서 점화식을 다음과 같이 세울 수 있다.
dp[n] = dp[n - 1] + dp[n - 2]
모든 n에 대하여 점화식을 세웠으니, 초기값(dp[1], dp[2])만 설정하고 반복문을 실행하면 정답을 도출할 수 있다.
Python 소스 코드)
import sys
input = sys.stdin.readline
n = int(input())
dp = [0] * 1000001 # 1 <= n <= 1000000
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = (dp[i-1] + dp[i-2]) % 15746
print(dp[n])
C++ 소스코드)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
using namespace std; | |
int main() { | |
ios::sync_with_stdio(false); | |
cin.tie(0); cout.tie(0); | |
int n; | |
cin >> n; | |
vector <int> v(n + 1); | |
v[0] = 0; v[1] = 1; v[2] = 2; | |
for (int i = 3; i < n + 1; ++i) { | |
v[i] = v[i - 1] % 15746 + v[i - 2] % 15746; | |
} | |
cout << v[n] % 15746 << "\n"; | |
return 0; | |
} |
반응형
'PS(Problem Solving) > 백준_BOJ' 카테고리의 다른 글
[백준] 1890번 - 점프 (파이썬) 문제 및 풀이 (0) | 2021.03.09 |
---|---|
[백준] 1520번 - 내리막 길 (C++, 파이썬) 문제 및 풀이 (0) | 2021.03.09 |
[백준] 14502번 - 연구소 (파이썬) 문제 및 풀이 (0) | 2021.03.03 |
[백준] 11053번 - 가장 긴 증가하는 부분 수열 (파이썬) (0) | 2021.03.02 |
[백준] 2206번 - 벽 부수고 이동하기 (파이썬) (0) | 2021.03.01 |
댓글