题目:
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...
) which sum to n.
For example, given n = 12
, return 3
because 12 = 4 + 4 + 4
; given n = 13
, return 2
because 13 = 4 + 9
.
动态规划。把一个数n分解为若干个完全平方数的和,这个和里面可能包含1,4,9,16,...,k,其中k是不大于n的最大的完全平方数。
把n看成 (n-1)+1,(n-4)+4,(n-9)+9等。这样把n分解为完全平方数的和,可以先把(n-k)分解后,再加上k。
因此我们可以列出动态规划的方程:设f(n)表示n最少可以由f(n)个完全平方数相加得到。则f(n)=min( f(n-1),f(n-4),...,f(n-k) )+1,其中k是不大于n的最大的完全平方数。
边界条件:f(0)=0。
复杂度O(n*sqrt(n))
代码:
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1);
dp[0]=0;
for(int i=1;i<=n;i++)
{
dp[i]=i;//至多是全部1相加
for(int j=1;j*j<=i;j++)
{
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
};