문제
https://www.acmicpc.net/problem/1699
해결방법
N이 주어졌을 때, N보다 작거나 같은 제곱수들을 모두 고려해야 한다.
를 제곱수들의 합으로 표현할 때 최소 개수라고 정의한다. 의 최댓값은 모두 1로만 이루어진 경우이므로 초기값을 i로 설정한다. 그러면 d[0]은 0, d[1]은 1, d[2]는 2, d[3]은 3으로 초기화할 수 있다.
이후, 가장 큰 제곱수 j^2을 선택하고 남은 값을 최소 개수로 만드는 방식으로 접근한다.
d[i] = min(dp[i], d[i - j*j] + 1)
이 점화식은 i에서 j의 제곱수를 뺐을 때, 남은 부분 d[i - j*j]의 최소 제곱수 개수에 1(i보다 작은 제곱수)을 더한 값 중에서 최소값을 선택하는 것이다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, dp[100001];
cin >> n;
dp[0] = 0;
for (int i = 1; i <= n; i++) {
dp[i] = i;
for (int j = 1; j*j <= i; j++) {
dp[i] = min(dp[i], dp[i - j*j] + 1);
}
}
cout << dp[n];
return 0;
}
'PS > Baekjoon' 카테고리의 다른 글
[백준] 5355: 화성 수학(C++) (0) | 2025.04.22 |
---|---|
[백준] 2167: 2차원 배열의 합(C++) (0) | 2025.04.14 |
[C++] 백준 1520: 내리막길 (0) | 2023.10.08 |
[C++] 백준 19637: IF문 좀 대신 써줘 (1) | 2023.10.06 |
[C++] 백준 1238: 파티 (1) | 2023.10.04 |
댓글