문제
https://www.acmicpc.net/problem/1699
문제 요약
자연수 N을 제곱수들의 합으로 나타내는 방법 중 그 항의 최소 개수를 구하는 출력한다.
코드
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
int dp[100010];
int n;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
dp[i] = i;
for (int j = 1; j * j <= i; j++) {
dp[i] = min(dp[i], dp[i - j * j] + 1);
}
}
cout << dp[n];
return 0;
}
코드 설명
1. dp[i]를 자연수 i를 제곱수들의 합으로 표현했을 때, 그 항의 최소 개수를 저장하는 DP 테이블로 정의한다.
2. dp[i]를 1로만 더해진 항의 개수인 i로 초기화한다.
3. dp[i] 값을 찾기 위해, 1부터 제곱 수를 탐색하며 dp[i - j * j] + 1 값과 비교한다.
dp[i - j * j] + 1
=> i - j * j를 제곱수들의 합으로 표현했을 때의 항들의 최소 개수 + j * j
'Algorithm Problems > 다이나믹 프로그래밍' 카테고리의 다른 글
[백준/C++] 11048번: 이동하기 (2) | 2024.11.12 |
---|---|
[백준/C++] 1890번: 점프 (1) | 2024.11.07 |
[백준/C++] 11057번: 오르막 수 (2) | 2024.09.18 |
[백준/C++] 11052번: 카드 구매하기 (1) | 2024.09.13 |
[백준/C++] 1904번: 01타일 (1) | 2024.09.09 |