반응형
#include <iostream>
using namespace std;
int DP[1000001];
int N;
int main()
{
cin >> N;
DP[1] = 1;
DP[2] = 2;
for (int i = 3; i <= N; i++)
{
DP[i] = (DP[i - 2] + DP[i - 1])%15746; // 요기서 나눠주지 않으면 long long의 범위를 넘어설수도 있음
}
cout << DP[N] << "\n";
return 0;
}
=
+
1. [N-1] 자리 2진 수열에서 [N] 자리 2진 수열을 만들 수 있는 경우의 수는 마지막 칸에 1이 오는 것 이외에는 없다.
2. [N-2]자리 2진 수열에서 [N] 자리 2진 수열을 만들 수 있는 경우의 수는 마지막 2칸에 00이 오는 것 이외에는 없다.
(마지막 2칸에 11이 오는 경우는 [N-1]자리 2진 수열에서 [N] 자리 2진 수열을 만들 수 있는 경우의 수에 포함됨)
따라서 점화식을 만들어보면 A[n]=A[n-1]+A[n-2] 이다. 점화식에서 보이듯이 피보나치 수열이다. 그리고 수가 얼마나 커질지 예상을 못하고 마지막 DP[N]을 출력할 때 DP[N]%15746를 해줬었는데 문제의 뜻은 DP로 구할 때마다 %15746을 해줘야 했었다.(그렇지 않으면 long long의 범위를 넘어서서 제대로 된 값이 출력이 안됨!)
간단한 DP문제였고 풀고나면 쉬운 문제다. 근데 매번 느끼는 거지만 처음에 문제 마주했을 때 어떻게 풀어야 할지 감이 안 오는데 아직 익숙지 않아서 그런가 보다.
반응형
'🧩PS > 🥈Nomal' 카테고리의 다른 글
[C/C++] 백준 1149번 - RGB거리(DP) (0) | 2020.11.01 |
---|---|
[C/C++] 백준 9461번 - 파도반 수열(DP) (0) | 2020.10.19 |
[C/C++] 백준 14889번 - 스타트와 링크 (DFS, 백트래킹, 비트마스킹, 브루트포스) (2) | 2020.10.14 |
[C/C++] 백준 14888번 - 연산자 끼워넣기 (DFS, 백트래킹) (0) | 2020.10.07 |
[C/C++] 백준 15652번 - N과 M (4) (DFS, 백트래킹) (0) | 2020.09.17 |