본문 바로가기

c++/Baekjoon Online

백준 : 제곱수의 합 C++ (DP 연습!!)

www.acmicpc.net/problem/1699

 

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