dp基礎之劃分型劃分最少完全平方數個數
阿新 • • 發佈:2018-11-19
問題:給定一個正整數n,問:最少可以將n分成幾個完全平方數(1 4 9 16..)之和?
例:
輸入:n = 13
13 = 4+9
輸出:2
分析:
狀態確定:最優策略中最後一步,假設n的最優劃分的最後一個平方數是j,
則需要知道n-j^2的最優劃分
轉移方程:
設:f[i]表示i的最優劃分的個數
f[i] = min{f[i-j^2]+1}(0<=j*j<i)
初始情況:
f[0] = 0
計算順序:
f[1]...f[n]
答案是f[n]
i從0到n,j從0到sqrt(i),時間複雜度是O(n^1.5)
程式碼及註釋如下:
def perfect_squares(n):
#初始f[0] = 0
f = [0 for i in range(n+1)]
for i in range(1,n+1):
f[i] = sys.maxsize
for j in range(1,int(i**0.5)+1):
if f[i-j**2]+1 < f[i]:
f[i] = f[i-j**2]+1
return f[n]
n = 13
print(perfect_squares(n))
#答案:2