각 수가 몇 개의 제곱 수 의합으로 이루어져있는지 푸는 문제, 다이나믹 프로그래밍을 이용해 이전 값을 저장하고 점화식을 세워가며 풀면 쉽다.
핵심은 7 = 1 + 1 + 1 + 4 라고 되있을 때 마지막 4이다. for문을 제곱으로 증가시켜가며 최소값을 찾고 그 값에 1을 더해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <iostream> #include <algorithm> using namespace std; int d[100050]; int main() { int input = 0; cin >> input; for (int i = 1; i <= input; ++i) { int val = d[i - 1]; for (int j = 2;j*j <= i; ++j) val = min(val, d[i - j*j]); d[i] = val + 1; } cout << d[input] << endl; return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 2225: 합분해 (0) | 2018.07.10 |
---|---|
백준 2133: 타일 채우기 (0) | 2018.07.10 |
백준 2579: 계단 오르기 (0) | 2018.07.10 |
백준 13398: 연속합 2 (0) | 2018.07.10 |
백준 1912: 연속합 (0) | 2018.07.09 |