[백준/BOJ] 백준 2193번 : 이친수
2020. 8. 1. 19:49ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/2193
index(0~n-1) 번이 number(0 또는 1)일 때 이친수의 개수를 구하는 함수를 만든다. 이 함수의 number가 0이면 그다음 숫자가 0일 때와 1일 때를 고려하지만, number가 1이면 그다음 숫자가 0일 때만 고려한다(이친수에서 1이 두 번 연속 나오지 않는다는 성질 이용), 그리고 0번 index의 number는 무조건 1이어야 한다(이친수는 0으로 시작할 수 없다는 성질 이용)
코드
#include <iostream>
#include <utility>
using namespace std;
int n;
long long cache[90][2];
void makeCache()
{
//-1로 초기화한다
for (int i = 0; i < 90; i++)
for (int j = 0; j < 2; j++)
cache[i][j] = -1;
}
//index(0~n-1)번이 number(0또는1)일때 이친수의 개수
long long solve(int index, int number)
{
//이친수의 끝일때
if (index == n-1)
return 1;
long long& ret = cache[index][number];
//이미 계산한적이 있을때
if (ret != -1)
return ret;
//number가 0이면 그 다음 숫자는 0또는1이 올 수 있다
if (number == 0)
ret = solve(index + 1, 0) + solve(index + 1, 1);
//number가 1이면 그 다음 숫자는 무조건 0이어야한다.
else if (number == 1)
ret = solve(index + 1, 0);
return ret;
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
//cache 초기화
makeCache();
cin >> n;
//0번 index는 0으로 시작할수 없으므로 무조건 1이어야한다
cout << solve(0, 1);
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 2156번 : 포도주 시식 (0) | 2020.08.01 |
---|---|
[백준/BOJ] 백준 1932번 : 정수 삼각형 (0) | 2020.08.01 |
[백준/BOJ] 백준 1003번 : 피보나치 함수 (0) | 2020.08.01 |
[백준/BOJ] 백준 10952번 : A+B - 5 (0) | 2020.07.26 |
[백준/BOJ] 백준 10844번 : 쉬운 계단 수 (0) | 2020.07.24 |