코딩테스트
[백준] 17626번 Four Squares
스키(ski)
2022. 8. 30. 16:39
문제 내용
https://www.acmicpc.net/problem/17626
17626번: Four Squares
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1
www.acmicpc.net
해결 코드
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
36
37
38
39
40
41
42
43
44
45
46
|
#include <cmath>//sqrt를 사용하기 위한 header
#include <iostream>
#define MAX_N 50001
using namespace std;
int dp[MAX_N];
int ans = 5;
void initialize() { //제곱수 초기화
int n = 1;
while (n * n <= 50000) {
dp[n * n] = 1;
n++;
}
}
int find(int n) {
if (!dp[n]) {
int min = 4;
int s = sqrt(n); //가장 가까운 제곱을 확인하기 위함 ex)26=5.xxx->5
for (int i = s; i > 0; i--) { //brute force부분
int search = find(n - (i * i)); //제곱을 뺀 나머지를 탐색
if (search < min) {//그중 최소가 되는값을 저장
min = search;
}
}
dp[n] = min + 1; // dp[n-i*i]+(dp[i*i]=1)
}
return dp[n];
}
int main() {
int n;
cin >> n;
initialize();
cout << find(n);
}
|
cs |
주요 개념
- 동적 프로그래밍 (Dynamic Programming,DP)
- 브루트포스 알고리즘(Brute force)
주의 사항
- 시간 제한이 0.5초 이기에 이에 유의해야함, 하지만 0<=n<=50000이라는 조건에 의해 탐색범위가 넓지않음