1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
풀이 및 후기
DP는 너무 어렵다
1. 일단 모두 1만 써서 더하는 경우는 항의 수가 자기 자신이므로 그것으로 초기화!
2. 그다음에 본인보다 작은 제곱수를 뺀 모든 경우에서의 DP값들 중 최솟값을 구하기
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
int n;
int cnt = 0;
cin >> n;
int dp[100000];
dp[1] = 1;
//다 1로만 해서 더하는거
for (int i = 0; i <= n; i++)
dp[i] = i;
for (int i = 2; i <= n; i++)
{
for (int j = 2; j*j <= i; j++)
{
//자기보다 제곱수들 한개 썼을때를 모두 비교해서 그중 젤 작은거로!!
dp[i] = min(dp[i], dp[i - j * j] + 1);
}
}
cout << dp[n] << endl;
return 0;
}
'c++ > Baekjoon Online' 카테고리의 다른 글
백준 : 다리 만들기 2 c++ (0) | 2020.11.19 |
---|---|
백준 : 기타줄 C++ (0) | 2020.11.18 |
백준 : 퇴사 c++ (0) | 2020.11.18 |
백준 1938 : 통나무 옮기기 c++ (0) | 2020.10.16 |
백준 19237 : 어른 상어 C++ (0) | 2020.10.15 |