Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- HTML #CSS
- 컴퓨터공학 #c #c언어 #문자열입력
- BOJ #컴퓨터공학 #C++ #알고리즘 #자료구조
- 컴퓨터공학 #자료구조 #스택 #c++ #알고리즘 #백준문제풀이
- 컴퓨터공학 #Java #자바 #클래스 #객체 #인스턴스
- 잔
Archives
- Today
- Total
영벨롭 개발 일지
[백준 BOJ][C++]2193번 이친수 풀이: DP 본문
https://www.acmicpc.net/problem/2193
이 문제는 Dynamic Programming, DP를 이용하여 해결할 수 있습니다.
이친수 성질인
(1) 0으로 시작하지 않는다.
(2) 1이 연속되지 않는다.
를 만족하는 dp를 설정하는 것은 간단합니다.
dp[n][2]를 dp로 설정합니다. dp[n][0]은 n번째 자리에서 0이 올 수 있는 경우의 수, dp[n][1]은 n번째 자리에서 1이 올 수 있는 경우의 수를 나타냅니다.
트리 형태로 보시면 이해가 빠릅니다.
1은 0으로부터 만들어지고 0은 1과 0으로부터 만들어집니다.
즉, 부모 노드가 1이라면 자식 노드는 0만, 부모 노드가 0이라면 자식 노드는 0과 1이 됩니다.
점화식을 나타내면
dp[n][0]=dp[n-1][0]+dp[n-1][1]
dp[n][1]=dp[n-1][1]
그렇다면 n자리 이친수의 수는 어떻게 될까요?
간단합니다 dp[n][0]+dp[n][1]을 해주면 됩니다.
n자리 이친수의 개수 = dp[n][0]+dp[n][1]
n | {dp[n][0], dp[n][1]} | n자리 이친수의 수 |
1 | {0, 1} | 1 |
2 | {1, 0} | 1 |
3 | {1, 1} | 2 |
4 | {2, 1} | 3 |
#include<iostream>
using namespace std;
long long dp[91][2] = { 0, };
int main(void) {
int n;
cin >> n;
dp[1][0] = 0;
dp[1][1] = 1;
dp[2][0] = 1;
dp[2][1] = 0;
for (int i = 3; i <= n; i++) {
dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
dp[i][1] = dp[i - 1][0];
}
cout << dp[n][0] + dp[n][1];
return 0;
}
반응형
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[백준 BOJ][C++]2606번 바이러스 풀이: BFS/DFS (0) | 2022.02.26 |
---|---|
[백준 BOJ][C++]2667번 단지번호붙이기: BFS/DFS (0) | 2022.02.26 |
[백준 BOJ][C++]15990번 1, 2, 3 더하기 5: DP (0) | 2022.02.25 |
[백준 BOJ][C++]11052번 카드 구매하기: DP (0) | 2022.02.25 |
[백준 BOJ][C++]11047번 동전 0 풀이: 그리디 알고리즘 (0) | 2022.02.24 |