백준 온라인 저지

백준 1699: 제곱수의 합

dev_doyle 2018. 7. 10. 02:00

각 수가 몇 개의 제곱 수 의합으로 이루어져있는지 푸는 문제, 다이나믹 프로그래밍을 이용해 이전 값을 저장하고 점화식을 세워가며 풀면 쉽다.

핵심은 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*<= i; ++j)
            val = min(val, d[i - j*j]);
        d[i] = val + 1;
    }
    cout << d[input] << endl;
    return 0;
}
cs