반응형

예를 들어,

12 == 11 + 1 == 8 + 4 == 9 + 3입니다.

즉, 1^2 + 11 또는 2^2 + 8 또는 3^2 + 3 으로 나타낼 수 있을 때, 항의 갯수가 1개만 늘어나며 최소 항의 갯수를 구할 수 있습니다.

결국 숫자 i와 제곱 수를 반복하는 j가 있다면, 숫자 (i - j * j)에서의 최소 항의 갯수 + 1이 숫자 i에서 얻을 수 있는 최소 항의 갯수입니다.

 

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
	int n, dp[100001];
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		dp[i] = i;
		double s = sqrt(i);
		int r = s;
		if (s == r) dp[i] = 1; // 제곱근이면 1
		else
			for (int j = 1; j <= r; j++)
				dp[i] = min(dp[i], dp[i - j*j] + 1);
	}
	printf("%d", dp[n]);
 }
반응형

'Algorithm' 카테고리의 다른 글

백준 11722 : 가장 긴 감소하는 부분 수열  (0) 2021.11.12
백준 11055 : 가장 큰 증가 부분 수열  (0) 2021.11.12
백준 9465 : 스티커  (0) 2021.11.12
백준 2193 : 이친수  (0) 2021.11.12
백준 11057 : 오르막 수  (0) 2021.11.12

+ Recent posts