LeetCode 279
先看怎么拆解一个数(n)到perfect square的和, 可以考虑减去(i)的平方,然后再继续拆解n-ii 的数. 按照这个想法,拆解可以通过递归或者dp来做.
在知道了所有的拆解方法之后,我们可以统计最小的可能.
如果我们用dp[n]的数组来记录n的最小拆解数,那么我们可以得到dp[n+1] = min(1 + dp[n+1 - xx] for x in rang(x, sqrt(n+1)))
转化为代码:
def numSquares(self, n: int) -> int:
dp = [0]*(n+1)
for number in range(1, n+1):
min_val = number # 全部拆解为1的情况
x, sq = 1, 1
while sq <= number:
min_val = min(xmin_val, 1 + dp[number-sq])
x += 1
sq = x * x
dp[number] = min_val
return dp[n]