문제

해결방법

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

+ Recent posts