1699 제곱수의 합
C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int DP[100003] = {0, };
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
for(int t=1; t<=n; t++) {
for (int k = 1; k * k <= t; k++) {
if(DP[t]==0) DP[t]=DP[t - k * k] + 1;
else DP[t] = min(DP[t], DP[t - k * k] + 1);
}
}
cout << DP[n] <<'\n';
return 0;
}
작은 수부터, DP 값을 채워나간다.
만약 DP[t]가 0이라면, (아직 채워지지 않았다면), 초기화를 진행하고
그렇지 않은 경우에는 가능한 DP 경우 중 최솟값을 저장한다.
'Algorithm > BOJ (백준)' 카테고리의 다른 글
[C++] 백준 1937 욕심쟁이 판다 (0) | 2020.07.25 |
---|---|
[C++] 백준 11066 파일 합치기 (0) | 2020.07.25 |
[C++] 백준 1149 RGB거리 (0) | 2020.07.25 |
[C++] 백준 11049 행렬 곱셈 순서 (0) | 2020.07.25 |
[C++] 백준 11053 가장 긴 증가하는 부분 순열 (0) | 2020.07.25 |