[문제]
19576번: 약수
가능 한 방법 중 하나로, a2를 12로, a3을 3으로 바꾸면 된다.
www.acmicpc.net
[풀이]
#다이나믹_프로그래밍 #수학 #정수론 #정렬
이 문제는 알고리즘 분류가 전부 방법을 설명해준 문제였다. 정렬-DP 순서로 진행하면 풀린다.
1. 미네랄 수치를 배열에 저장한다.
2. 입력받은 수치를 오름차순 정렬한다.
3. 다이나믹 프로그래밍을 통해 경우에 따라 나누어 떨어지는(그냥 둬도 되는) 수치의 수를 센다.
4. 총 미네랄의 개수에서 dp[] 중 가장 큰 값을 빼준다.
(전체 코드)
#include <iostream> #include <algorithm> using namespace std; int main() { int mineral, cnt = 0; long long min[5001]; long long dp[5001] = { 0 }; cin >> mineral; for (int i = 0; i < mineral; i++) { cin >> min[i]; } sort(min, min + mineral); for (int i = 0; i < mineral; i++) { for (int j = i; j >= 0; j--) { //나누어 떨어진다면 +1 if (min[i] % min[j] == 0) dp[i] = max(dp[j] + 1, dp[i]); } } for (int i = 0; i < mineral; i++) { if (dp[i] > cnt)cnt = dp[i]; } cout << mineral - cnt; return 0; }
[백준] 19572번 가뭄(Small) (c++) (0) | 2021.08.14 |
---|---|
[백준] 1449번 수리공 항승 (c++) (0) | 2021.07.10 |
[백준] 1157번 단어 공부 (c++) (0) | 2021.07.07 |
[백준] 4673번 셀프 넘버 (c++) (0) | 2021.07.05 |
[백준] 1712번 손익분기점 (c++) (0) | 2021.07.05 |
댓글 영역