Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Eulerian circuit
- BFSDFS
- hashing
- BOJ
- bitmask
- CS Academy
- Cycle detecting
- Segment Tree
- 백준
- implementation
- disjoint-set
- Dag
- mathematics
- Greedy
- GCD
- scc
- graph
- Shortest path
- flows
- Sieve_of_Eratosthenes
- Euler path
- dynamic programming
- DynamicProgramming
- Euler circuit
- backtracking
- graph modeling
- BST
- POJ
- Eulerian path
- Algospot
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 3001 이상한 문제 본문
* BOJ 3001 이상한 문제
[분류 : 다이나믹 프로그래밍]
[풀이]
1. [각 자리수 합이 S인 개수]
구간이 정해져 있으므로 1부터 B까지 합이 S인 것의 개수에서 0부터 A-1까지 합이 S인 것의 개수를 빼준다. 이렇게하면 똑같은 함수를 두 번 호출하는 꼴이 나온다.
rec(limit, position, summation, A)
※ limit은 주어진 A보다 작은 경우만 세야하므로 제한을 두는 변수다.
기저영역은 A보다 작은 자리수에 대해 숫자를 채웠고 남은 summation이 0이 되는 경우에 1 더해주면 된다.
2. [A보다 크거나 같고 B보다 작은 수 중 자리수 합이 S가 되는 가장 작은 정수]
문제 조건에서 적어도 하나 이상의 수가 반드시 존재한다고 했으니 이 값은 A와 가장 가까운 정수를 출력해주시면 되겠다
rec2(limit, position, summation, A)
※ limit은 주어진 A보다 큰 경우만 세야하므로 두는 제한 변수다.(A-1을 넘겨서 호출하면 결국 A와 같거나 큰 경우를 가져온다)
다소 어려운 점이 있다면 자리수가 자체가 증가할 수 있단 사실이다. 이는 자리수를 하나씩 늘려가면서 가능 여부를 판단해주면 된다. 가능한 자리수 중 가장 짧은 길이일 때 종료시키고 답을 도출해내면 된다.
(참고) 자리수 dp에 대해 연습하고 싶으시다면 BOJ 3026 V 문제를 푸는 것을 추천합니다. 이거 풀면 웬만한 거 다 풀지 않을까싶네요
'Solved problems' 카테고리의 다른 글
BOJ 1023 괄호 문자열 (1) | 2020.06.04 |
---|---|
BOJ 17428 K번째 괄호 문자열 (0) | 2020.06.04 |
BOJ 16876 재미있는 숫자 게임 (0) | 2020.05.28 |
BOJ 2543 초고속철도 (0) | 2020.05.28 |
BOJ 2888 상범 게임 (0) | 2020.05.28 |
Comments