본문 바로가기

Algorithm/백준

백준 17626번 four squares (c++)

어떤 수를 제곱수의 합으로 표현할 때, 사용되는 최소 제곱수의 개수를 구하는 문제이다.

다이나믹 프로그래밍으로 문제를 해결할 수 있다.
n = (0, 1, 2, 3, ... n -1) + k2(k는 k2 <= n 인 자연수) 의 형태로 n을 구하면서 최소 합이 만들어지는 경우를 dp에 저장하면된다.

#include <iostream>
#include <algorithm>

using namespace std;

#define MAX_NUM 50005
int dp[50005];

int main()
{
    int n;
    cin >> n;
    dp[0] = 0;
    dp[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        int localMin = MAX_NUM;
        for (int j = 1; j * j <= i; j++)
        {
            localMin = min(localMin, dp[i - j * j] + 1);
        }
        dp[i] = localMin;
    }
    cout << dp[n] << '\n';
    return 0;
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

백준 11724번 연결 요소의 개수 (c++)  (0) 2020.10.01
백준 1764번 듣보잡 (c++)  (0) 2020.09.29
백준 1697번 숨바꼭질 (c++)  (0) 2020.09.29
백준 1012번 유기농 배추 (c++)  (0) 2020.09.29
백준 11049 행렬 곱셈 순서  (0) 2020.09.21