Algorithm
DP_백준_제곱수의 합_1699
MoYoungmin
2018. 8. 19. 20:30
마지막 항이 무엇이 오는지가 중요하다. 또한 그 마지막항은 제곱수이다. 마지막 항에는 1, 2^2, 3^2 등이 올 수있고 이를 탐색하면서 최소값을 찾는다.
1. 정의 : dp[N] : N을 제곱수의 합으로 타나냈을 때, 필요한 항의 최소 개수
2. 점화식 : dp[N]=min(dp[N-i^2]+1) (1<=i^2<=N) (i^2이 아닌 i를 쓸 경우
3. 초기화 : dp[I]=I (0<=I<=N)
이 문제의 시간 복잡도는 O(N) * 루트N
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <iostream> using namespace std; int main() { int n; cin >> n; int * dp = new int[n + 1]; for (int i = 0; i <= n; i++) { dp[i] = i; // Initialize for (int j = 1; j*j <= i; j++) { if (dp[i - j * j] + 1 < dp[i]) { dp[i] = dp[i - j * j] + 1; } } //Calculate } cout << dp[n] << endl; } | cs |