-
[C++] BOJ 1699번: 제곱수의 합프로그래밍/알고리즘 PS 2020. 12. 8. 11:08
문제 설명
DP를 이용하여 문제를 해결하였다. dp1에는 1~루트 N의 제곱수를 저장하였고, dp2에는 N을 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 저장하였다.
코드
#include <iostream> #define MAX 987654321 using namespace std; int num; int dp1[400]; // n의 제곱을 저장 int dp2[100006]; int main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> num; for (int i = 1; i * i <= num; i++) { dp1[i] = i * i; } dp2[1] = 1; dp2[2] = 2; dp2[3] = 3; for (int i = 4; i <= num; i++) { dp2[i] = MAX; int sqrtnum; for (sqrtnum = 1; sqrtnum * sqrtnum <= i; sqrtnum++) ; sqrtnum--; for (int j = sqrtnum; j >= 1; j--) { if (j * j == i) { dp2[i] = 1; break; } dp2[i] = min(dp2[j * j] + dp2[i - j * j], dp2[i]); } } cout << dp2[num] << '\n'; return 0; }
'프로그래밍 > 알고리즘 PS' 카테고리의 다른 글
[C++] BOJ 9506번: 약수들의 합 (0) 2024.03.28 [C++] BOJ 1629번: 곱셈 (0) 2024.03.28 [C++] BOJ 2579번: 계단 오르기 (0) 2020.12.08 [C++] BOJ 1912번: 연속합 (0) 2020.12.01 [C++] BOJ 11053번: 가장 긴 증가하는 부분 수열, 11055번: 가장 큰 증가 부분 수열,. 11722번: 가장 긴 감소하는 부분 수열 (0) 2020.11.30