Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 17626 Four Squares (c++) : 피너클 본문

백준

백준 17626 Four Squares (c++) : 피너클

피너클 2022. 6. 21. 23:43
728x90
반응형

https://www.acmicpc.net/problem/17626

 

17626번: Four Squares

라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1

www.acmicpc.net

dp문제다.

개인적으로 탑 다운 방식을 좋아하지만 이 문제는 계산량때문인지 계속해서 오류가나 바텀 업으로 풀었다.

arr[0] = 0;
arr[1] = 1;

arr[0]은 제곱수들이 들어가는 배열이고 arr[1]은 1 * 1을 미리 초기화한것이다.

for (int i = 2; i <= n; i++) {
	arr[i] = 50001;

n까지 반복하며 arr[i]는 50001로 초기화해놓는다. 절대 나오지 않을 높은수로 하면된다.

	for (int j = 1; i - j * j >= 0; j++) {
		arr[i] = min(arr[i], arr[i - j * j] + 1);
	}
}

arr[50]을 알고싶다고 했을때 

arr[50] = min(arr[50], arr[50 - 1 * 1] + 1);

arr[50] = min(arr[50], arr[50 - 2 * 2] + 1);

arr[50] = min(arr[50], arr[50 - 2 * 2] + 1);

이걸 계속해서 반복하는것이다.

#include <iostream>
#include <algorithm>

using namespace std;

int n;
int arr[50001];

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	arr[0] = 0;
	arr[1] = 1;
	for (int i = 2; i <= n; i++) {
		arr[i] = 50001;
		for (int j = 1; i - j * j >= 0; j++) {
			arr[i] = min(arr[i], arr[i - j * j] + 1);
		}
	}
	cout << arr[n] << endl;
}
728x90
반응형
Comments