Algorithm/Dynamic Programming

[C++] 백준 1699번 : 제곱수의 합 (S3)

supremo7 2020. 11. 10. 21:04

#문제

www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

#풀이 & 학습한 내용

dp[i]를 i의 제곱수 항의 최소개수로 정의하자. 그러면 소스코드의 12~17행에 해당하는 obtimal substructure를 얻을 수 있다. 이때 j를 sqrt(i)까지 반복한다는 것에 주목하자. 이를 위해 #include<cmath>를 추가해줬다.(j<=sqrt(i)를 j*j<=i로 변경가능하다) dp[i]에 맨 처음에는 최악의 경우인 모두 1로 구성될 경우의 'i'를 넣어주고, j를 1부터 sqrt(i)까지 증가시키며 dp[i-j*j]+1과 dp[i]를 비교해 최소의 개수를 필요할 경우 갱신시켜준다. 

 

#소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<algorithm>
#include<cmath>
 
using namespace std;
 
int dp[100002];
 
int main(void) {
    int N;
    cin >> N;
    for (int i = 1; i <= N; i++) {
        dp[i] = i;//모두 1로만 구성된 최악의 경우
        for (int j = 1; j <= sqrt(i); j++) {
            dp[i] = min(dp[i], dp[i - j * j] + 1);
        }
    }
    
    cout << dp[N] << '\n';
}
cs

 

github.com/HoYoungChun/BOJ_algorithm/blob/master/Dynamic_Programming/BOJ_1699.cpp

 

HoYoungChun/BOJ_algorithm

Baekjoon Online Judge problem solving by C++. Contribute to HoYoungChun/BOJ_algorithm development by creating an account on GitHub.

github.com