본문 바로가기

백준/DP

백준 1351 - 무한 수열

728x90

noj.am/1351

 

P, Q가 최소 2이기에 N을 계속 쪼개는 과정은 지수적 감쇠를 생각하면 그렇게 많은 연산을 요하지 않음을 알 수 있다.

 

따라서 동적계획법을 통해 쪼개가면서 얻은 값을 저장하면 빠르게 풀 수 있을텐데 문제는 N의 범위가 커서 배열로 저장을 할 수 없다는 것이다.

 

이를 해결하기 위해 map을 사용하여 값을 저장하면 필요한 값만 메모리를 사용하기 때문에 메모리 할당에 문제 없이 문제를 풀 수 있다.

 

전체 코드

더보기
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
#include <iostream>
#include <unordered_map>
 
using namespace std;
using ll = long long;
 
unordered_map<ll, ll> dp;
ll n, p, q;
 
ll memo(ll num)
{
    if (dp.count(num))
        return dp[num];
    return dp[num] = memo(num / p) + memo(num / q);
}
 
int main()
{
    dp[0= 1;
    cin.tie(0); ios::sync_with_stdio(false);
 
    cin >> n >> p >> q;
 
    cout << memo(n);
}
cs
728x90

'백준 > DP' 카테고리의 다른 글

백준 1754 - 진영 순열  (0) 2021.01.03
백준 1086 - 박성원  (0) 2020.12.31
[POI] 백준 2287 - 모노디지털 표현  (0) 2020.12.26
[ICPC] 백준 2066 - 카드놀이  (0) 2020.12.24
백준 1480 - 보석 모으기  (0) 2020.12.23