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, -1, sizeof(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*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 |