프로그래밍/알고리즘 PS
[C++] BOJ 1699번: 제곱수의 합
코딩 제이티
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;
}