[C++/백준] 1699번: 제곱수의 합

mrkle·2022년 2월 14일

문제 바로가기

문제 해결 아이디어

  • 점화식 도출 과정
    1. DP[N] = AN이 되기 위해 필요한 최소항의 개수 A 로 정의
    2. DP[0] = 0이 되기 위해 필요한 최소항의 개수는 0
    3. DP[1] = 1이 되기 위해 필요한 최소항은 121^2 이므로 1
    4. DP[2] = 2가 되기 위해 필요한 최소항은 121^2+ 121^2 이므로 2
    5. DP[3] = 3이 되기 위해 필요한 최소항은 121^2+ 121^2+ 121^2 이므로 3
    6. DP[4] = 4가 되기 위해 필요한 항은 222^2, 12+12+12+121^2+ 1^2+ 1^2+ 1^2 두가지 경우가 존재하는데, 이중 최소항은 222^2 이므로 1

  • 규칙 살펴보기
    1. DP[2]DP[1] + 1이고, DP[3]DP[2] + 1이다.
    2. DP[4]와 같이 N이 제곱수인 경우, DP[3] + 1222^2을 비교하면, 222^2이 최소항 이므로 1이다.
    3. DP[8]의 경우, N이 제곱수는 아니지만 DP[7] + 122+222^2+ 2^2를 비교하면, 최소항이 22+222^2+ 2^2이므로 2이다.
    이때, 22+222^2+ 2^2에서 222^2DP[4]의 최소항이고, DP[4]를 이용하여 DP[8] = DP[4] + 1로 나타낼 수 있다. 따라서, DP[8] = min(DP[7] + 1, DP[4] + 1)

  • 점화식 도출
    따라서, DP[N]의 최소항의 개수는 DP[N - 1] 부터 DP[0] 까지 반복하며 +1 한 값들 중 최솟값이 된다.
    DP[N] = min(DP[N - i^j]) (i = 1 ~ N, j = 1 ~ j * j <= i)

코드

profile
꿈꾸는개발자

0개의 댓글