-
[BOJ] 1699 :: 제곱수의 합알고리즘/BOJ(C++) 2018. 6. 16. 20:25반응형
https://www.acmicpc.net/problem/1699
다이나믹 프로그래밍으로 푸는 문제입니다.
다이나믹 프로그래밍을 생각할때 저는 항상 1차원 다이나믹인지, 2차원 다이나믹인지를 먼저 생각합니다.
이 경우에는 고려할 요건이 제곱수 밖에 없으므로 1차원으로 풀릴 것 같네요.
1차원 dp[100001]개를 잡은 후에
dp[i]의 조건을 정의합니다.
dp[i]는 i를 만드는데 필요한 제곱수의 최소 개수로 정의합니다.
그 후 점화식을 이용해 dp[i]를 구해야 합니다.
dp[i]를 구하기 위해선 i보다 작은 어떤 수 + 임의의 제곱수를 했을 때 i가 나오는 경우를 탐색해야 합니다.
때문에 i와 같거나 작은 경우까지 각각의 경우에 (i에서 제곱수를 뺀 수의 dp값 + 1) 과 현재 dp값을 비교해 나가면서 최솟값을 찾아야 합니다.
#include <iostream>using namespace std;int dp[100001];//dp[i]는 i를 제곱수들의 합으로 표현할 때 항의 최소 개수int main(){int n;cin >> n;dp[0] = 0;dp[1] = 1;//dp 초기값for (int i = 2; i <= n; i++){dp[i] = 1000001;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] << endl;}반응형'알고리즘 > BOJ(C++)' 카테고리의 다른 글
[BOJ] 1373 :: 2진수 8진수 (0) 2018.06.19 [BOJ] 2225 :: 합분해 (0) 2018.06.16 [BOJ]1406 :: 에디터 (0) 2018.06.16 [BOJ] 6679 :: 싱기한 네자리 숫자 (0) 2018.06.02 [BOJ] 8958 :: OX퀴즈 (0) 2018.06.02