[문제]
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 |
댓글 영역