백준 17626
17626번: Four Squares
라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1
www.acmicpc.net
1. 주어진 수와 같거나 작은 가장 큰 제곱수를 우선으로 그리디하게 풀면 틀린다.
더 작은 경우가 존재
ex) 11339 = 106^2 + 10^2 + 1^2 + 1^2 + 1^2 (5 : 오답)
11339 = 105^2 + 17^2 + 5^2 (3 : 정답)
2. dp를 이용해 min을 갱신하면서 찾는다.
dp[n] = 합이 n이 되는 제곱수의 개수라고 하자.
- dp[n] = n이라고 초기화시킬 수 있다. (1^2이 n개 더해진 수)
- dp[i^2] = 1이다. (어떤 수의 제곱수는 항상 1)
- (중요) dp[n] = dp[n-i] + dp[i]가 성립한다.
--> dp[n] = dp[n - i^2] + dp[i^2] = dp[n - i^2] + 1
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
int dp[50001];
for (int i = 0;i <= 50000;i++) dp[i] = i;
for (int i = 1;i <= n;i++) {
for (int j = 1;j*j<=i;j++) {
dp[i] = min(dp[i], 1 + dp[i - j * j]);
}
}
cout << dp[n];
}
'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
[BOJ 20047] 동전 옮기기 (0) | 2021.10.03 |
---|