본문 바로가기

다이나믹 프로그래밍

제곱수의 합

https://www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

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

www.acmicpc.net

d[n] = min (d[n - i ^ 2] ) + 1 ( 1 <= i ^ 2 <= N)

시간 복잡도 O( N * N ^ 1/2)

최소값 구하는 문제 --> 초기값 설정 중요!!

d[i]는 i를 넘을 수가 없다 고로, i로 설정하자

 

내 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <cstring>
 
using namespace std;
 
int d[100000];
 
int main()
{
    memset(d, -1sizeof(d));
 
    d[1= 1;
 
    int n;
    cin >> n;
    for (int i = 2; i <= n; i++)
    {
        for (int j = 1; j < i; j++)
        {
            if (j * j > i)
                break;
            else if (j * j == i)
            {
                d[i] = 1;
                break;
            }
            if (d[i] == -1 || d[i - j * j] < d[i])
                d[i] = d[i - j * j] + 1;
        }
    }
 
    cout << d[n];
 
    return 0;
}
cs

-1로 초기화를 하고 초기값 설정을 그 때 그 때 해줬다

 

답지

최대값을 설정하고 비교

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int d[100001];
int main() {
    int n;
    cin >> n;
    for (int i=1; i<=n; i++) {
        d[i] = i;
        for (int j=1; j*<= i; j++) {
            if (d[i] > d[i-j*j]+1) {
                d[i] = d[i-j*j]+1;
            }
        }
    }
    cout << d[n] << '\n';
    return 0;
}
cs

'다이나믹 프로그래밍' 카테고리의 다른 글

RGB 거리 & 동물원 & 오르막수  (0) 2023.03.27
합분해  (0) 2023.03.27
연속합  (0) 2023.03.26
가장 긴 증가하는 부분 순열 (출력)  (0) 2023.03.26
가장 긴 증가하는 부분 수열  (0) 2023.03.26