class Solution:
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
# # BFS
# # 每一层都减去所有可以减去的平方数,下一层判断所有(x-平方数)
# if n < 2:
# return n
# lst = []
# i = 1
# while i * i <= n:
# lst.append( i * i )
# i += 1
# cnt = 0
# toCheck = {n}
# while toCheck:
# cnt += 1
# temp = set()
# for x in toCheck:
# for y in lst:
# if x == y:
# return cnt # 返回第一个cnt,即为最短路径
# if x < y:
# break
# temp.add(x-y)
# toCheck = temp
# return cnt
# dp
if n ** 0.5 == int(n ** 0.5):
return 1
dp = [i for i in range(n + 1)]
square = [i ** 2 for i in range(int(n ** 0.5) + 1)]
for i in range(1, n + 1):
for item in square:
if i - item < 0:
break
else: # 状态转移方程,i-item最少为0
dp[i] = min(dp[i], dp[i - item] + 1)
return dp[n]