전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

PS/BOJ

BOJ 1699 제곱수의 합

2021. 7. 8. 03:02

boj 1699 제곱수의 합

수가 주어지면 그 수를 제곱수들의 합으로 표현할 때, 최소의 항 갯수를 구하는 문제이다.
모든 수는 1의 합으로 표현할 수 있기에 최대의 항 갯수는 입력된 수의 크기와 동일하다.
그러므로, 테이블 D[i]를 i를 제곱수의 합으로 표현할 때의 최소의 항 갯수라고 정의하면, D[i] = i 라고 초기 값을 지정해줄 수 있다.
최소의 항 갯수를 구하는 방법은 간단하다. i에서 i를 넘지 않는 제곱수를 빼면서 최소 항의 갯수를 변경해주는 것이다.
이를 점화식으로 나타내보자.

D[i] = min(D[i], D[i - 제곱수]+1)

이때, +1을 해주는 이유는 제곱수에 해당하는 항 갯수를 더해주는 것이다.

#include <iostream>
#include <algorithm>
using namespace std;

int n;
int D[100005];

int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++) D[i] = i;

    for (int i = 4; i <= n; i++)
    {
        for (int j = 1; j * j <= i; j++)
        {
            D[i] = min(D[i], D[i - j * j] + 1);
        }
    }

    cout << D[n];
}
저작자표시 (새창열림)

'PS > BOJ' 카테고리의 다른 글

BOJ 9461 파도반 수열  (0) 2021.07.09
BOJ 2133 타일 채우기  (0) 2021.07.08
BOJ 2579 계단 오르기  (0) 2021.07.08
BOJ 1912 연속합  (0) 2021.07.06
BOJ 11054 가장 긴 바이토닉 부분 수열  (0) 2021.07.06
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 9461 파도반 수열
    • BOJ 2133 타일 채우기
    • BOJ 2579 계단 오르기
    • BOJ 1912 연속합
    모달조아
    모달조아

    티스토리툴바