문제
해결방법
step1. 1,4,6,9같은 제곱수에 1을 넣어준다.
step2. 나머지 숫자들을 찾아준다.
for (a = 1; a <=sqrt(i); a++) {
#dp[i]를 구하고자한다.
#min( dp[i-1^2]+1, dp[i-2^2]+1, dp[i-3^2]+1....dp[i-sqrt(i)^2] ) 이다.
if (dp[i - a * a] < minx)
minx = dp[i - a * a];
}
dp[i] = minx + 1;
코드
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
int main()
{
int input;
int dp[100010];
cin >> input;
dp[1] = 1;
int a;
int minx;
int i, j;
for (i = 1; i <= sqrt(input); i++) {
dp[i*i] = 1;
}
for (i = 2; i <= input; i++) {
if (dp[i] == 1)
continue;
else {
minx = 100001;
for (a = 1; a <=sqrt(i); a++) {
if (dp[i - a * a] < minx)
minx = dp[i - a * a];
}
dp[i] = minx + 1;
}
}
cout <<dp[input];
return 0;
}
'알고리즘 > 다이나믹프로그래밍' 카테고리의 다른 글
백준 10942번 팰린드롬 (0) | 2019.02.08 |
---|---|
백준 2225 합분해 (0) | 2019.02.06 |
백준1912 연속합 (0) | 2019.02.01 |
백준11053번 가장 긴 증가하는 부분 수열 (0) | 2019.01.31 |
백준11057 오르막 수 (0) | 2019.01.30 |