728x90
시간 제한 : 2초
메모리 제한 : 128MB
입력
첫째 줄에 3개의 정수 N, P, Q가 주어진다.
출력
첫째 줄에 A_N을 출력한다.
소스코드
#include <map> #include <iostream> using namespace std; map<long long, long long> dp; long long recursive(long long N, long long& P, long long& Q) { if (N == 0) return 1; else if (dp[N]) return dp[N]; return dp[N] = recursive(N / P, P, Q) + recursive(N / Q, P, Q); } int main(void) { long long N, P, Q; cin >> N >> P >> Q; cout << recursive(N, P, Q); }
Tip
일반적으로 DP(동적계획법, 다이나믹) 문제를 풀 때는 배열을 이용하지만, 이 문제는 배열을 사용하지 않는다. 문제 조건 상, 배열을 최대 10^12까지 배열을 생성해서 만들 수도 없을 뿐더러, 만들 필요도 없다. 따라서 맵(map)을 이용해서 필요한 구간만 구하는 방법으로 접근한다.
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 14582 - 오늘도 졌다(2017 고려대학교 프로그래밍 대회) (0) | 2019.03.12 |
---|---|
백준] 2721 - 삼각수의 합(ACM-ICPC Regionals) (0) | 2019.03.11 |
백준] 1598 - 꼬리를 무는 숫자 나열 (0) | 2019.03.10 |
백준] 2890 - 카약(COCI 2009/2010) (0) | 2019.02.20 |
백준] 9469 - 폰 노이만(ACM-ICPC Regionals) (0) | 2019.02.19 |