https://www.acmicpc.net/problem/17626
Initially I just did the biggest square number that is closes to the given integer and subtracting it from n until n reaches 0. But that is not a guaranteed way to get min number of ways. We can do it either via DP or brute force
First we initialise a dp list where all squares will have value 1. Then, as we iter from 1 to n, if dp[i]==0, then we can use previous dp values to build upon this dp[i] value, specifically the previous dp value we would be using is the previous squares j*j that is less or equal to i.
So the logic is like
dp[i]=dp[i-j*j] + dp[j*j]
But if there already is a value in dp[i] that isnt 1, we take the minimum value.
dp = [0] + [0 for _ in range(50000)]
n = int(input())
k = 1
while k*k <= n:
dp[k*k] = 1
k += 1
for i in range(1, n + 1):
if dp[i] == 1:
continue
j = 1
while j*j <= i:
if dp[i] != 0:
dp[i] = min(dp[i], dp[j*j] + dp[i - j*j])
else:
dp[i] = dp[j*j] + dp[i - j*j]
j+=1
print(dp[n])
https://velog.io/@sbkwon16/%EB%B0%B1%EC%A4%80-17626%EB%B2%88-Python
Let's analyze the time and space complexity of the provided code:
while loop runs until k*k becomes greater than n. The number of iterations is approximately proportional to the square root of n. Therefore, the time complexity of this part is O(sqrt(n)).for loop iterates from 1 to n, and the inner while loop iterates until j*j becomes greater than i. In the worst case, the inner while loop runs for each value of i, resulting in a time complexity of O(n * sqrt(n)).dp array is created with a size of 50001. Therefore, the space complexity is O(50001), which can be simplified to O(1) or constant since it's not dependent on the input size n.In summary, the time complexity is O(n * sqrt(n)), and the space complexity is O(1) for the provided code.