컴퓨터과학/알고리즘_PS
[백준] 17626 - Four Squares
MG#
2022. 4. 27. 09:25
https://www.acmicpc.net/problem/17626
17626번: Four Squares
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1
www.acmicpc.net
보자마자 dp 문제라 생각하였습니다. 자연수가 어떤 제곱수와 몇 번 더해서 만들어지게 되는데 그 자연수에 제곱수를 뺄 때마다 또 하나의 자연수가 나오기 때문입니다. 예를 들어 dp[26]은 dp[26 - 1^2] + 1, dp[26 - 2^2] + 1, ... dp[26 - 5^2] + 1 중 최소값입니다. 그래서 DP 함수를 선언해 재귀로 돌렸습니다.
#include <iostream>
#define MAX 50001
#define INF 100000000
using namespace std;
int dp[MAX];
int n;
int DP(int num) {
if (dp[num] != INF)
return dp[num];
for (int i = 1; i * i <= num; i++)
dp[num] = min(dp[num], DP(num - i * i) + 1);
return dp[num];
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i <= n; i++)
dp[i] = INF;
dp[0] = 0;
dp[1] = 1;
cout << DP(n) << "\n";
return 0;
}