주소 : https://www.acmicpc.net/problem/17626
17626번: Four Squares
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1
www.acmicpc.net
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, num = 0;
vector<int> dp(50001, 0);
cin >> n;
dp[1] = 1;
for (int i = 1; i <= n; i++)
{
dp[i] = dp[1] + dp[i - 1];
for (int j = 2; j * j <= i; j++)
{
dp[i] = min(dp[i], 1 + dp[i - j * j]);
}
}
cout << dp[n] << '\n';
}
마무리 : 우리가 구하고 싶은 답은 최소 제곱수 합으로 표현하는 것이다. 처음 볼 때 dp를 이전 문제 풀 듯이 단순하게 짰는데 그러기에는 잘 되지 않았다.
그래서 다른 방법으로 제곱수 합을 구하고 싶은거니까 입력값에 제곱수를 뺀 dp와 직접 구한 dp를 구하여 최솟값을 비교하여 출력하였다.
'백준 > C++' 카테고리의 다른 글
백준 1260번 : DFS와 BFS [C++] (0) | 2022.09.05 |
---|---|
백준 1012번 : 유기농 배추 [C++] (0) | 2022.09.05 |
백준 11727 : 2xn 타일링 2 [C++] (0) | 2022.09.04 |
백준 11726번 : 2xn 타일링 [C++] (0) | 2022.09.04 |
백준 11659번 : 구간 합 구하기 4 [C++] (0) | 2022.09.02 |