문제
https://www.acmicpc.net/problem/1699
1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
코드
#include <iostream>
using namespace std;
int dp[100001] = {0};
int main(){
int n;
cin >> n;
for(int i=1; i<=n; i++){
dp[i] = i;
for(int j=1; j*j<=i; j++){
if(dp[i] > dp[i-j*j]+1){
dp[i] = dp[i-j*j] + 1;
}
}
}
cout << dp[n];
return 0;
}
정리
쭉 나열해본다음 제곱수에서 규칙을 찾겠다는 생각이 들었지만 끝내 스스로 코드로 구현을 하지 못해 다른 사람 코드를 참고했다. 이중 for문을 이용하고 dp[i-j*j] 방식으로 제곱수를 빼는 방식으로 구현했다. dp에서 규칙 찾는 연습을 더 열심히 해야겠다.
참조
'Beakjoon > dynamic programming' 카테고리의 다른 글
[백준] 11659번 구간 합 구하기 4 (C++) - dynamic programming (0) | 2022.02.14 |
---|---|
[백준] 14501번 퇴사 (C++) - dynamic programming (0) | 2022.02.04 |
[백준] 1912번 연속합 (C++) - dynamic programming (0) | 2022.01.26 |
[백준] 15990번 1, 2, 3 더하기 5 (C++) - dynamic programming (0) | 2022.01.24 |
[백준] 11052번 카드 구매하기 (C++) - dynamic programming (0) | 2022.01.23 |