GitHubSeob
C++ / 백준 / 2193 / 이친수 본문
문제
https://www.acmicpc.net/problem/2193
2193번: 이친수
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않
www.acmicpc.net
문제풀이
N이 90까지니까 개수가 별로 안 크겠지라고 생각하고 int형 배열을 사용했다가 틀리고 long long형으로 고치고 맞았다.
DP문제는 웬만하면 long long형을 쓰는 게 나을 것 같다.
이 문제에는 규칙이 있다.
1. 첫 번째 숫자는 무조건 1로 시작한다.
2. 1로 연속된 숫자는 불가능하다.
1, 2번을 합치면 모든 이친 수는 10으로 시작한다는 것을 알 수 있다.
ex) 5자리 숫자일 때, 10을 제외하면 3자리 숫자가 남는다.
0으로 시작하는 수는 없지만 편의상 DP[0]=1로 둔다.
세 자릿수 첫 번째 자리에 1이 들어가는 경우 -> DP[3]
세 자릿수 첫 번째 자리에 0이 들어가는 경우
· 세 자릿수 두 번째 자리에 1이 들어가는 경우 -> DP[2]
· 세 자릿수 두 번째 자리에 0이 들어가는 경우
· · 세 자릿수 세 번째 자리에 1이 들어가는 경우 -> DP[1]
· · 세 자릿수 세 번째 자리에 0이 들어가는 경우 -> DP[0]
따라서 DP[5] = DP[3]+DP[2]+DP[1]+DP[0]이다.
DP[n]는 DP[0]~DP[n-2]을 모두 더한 값이다.
코드
#include <iostream>
using namespace std;
int main() {
int N = 0;
cin >> N;
long long DP[91] = { 0, };
DP[0] = DP[1] = DP[2] = 1;
for (int i = 3; i <= N; ++i) {
for (int j = 0; j <= i - 2; ++j) {
DP[i] += DP[j];
}
}
cout << DP[N];
}
'Baekjoon > Silver' 카테고리의 다른 글
C++ / 백준 / 2156 / 포도주 시식 (0) | 2021.08.07 |
---|---|
C++ / 백준 / 11053 / 가장 긴 증가하는 부분 수열 (0) | 2021.08.06 |
C++ / 백준 / 9465 / 스티커 (0) | 2021.08.06 |
C++ / 백준 / 2644 / 촌수계산 (0) | 2021.08.05 |
C++ / 백준 / 2293 / 동전 1 (0) | 2021.08.05 |