题目描述:给定一个正整数,求其最少可以由几个完全平方数相加构成。
题目解析:
对于分割类型题,动态规划的状态转移方程通常并不依赖相邻的位置,而是依赖于满足分割条件的位置。我们定义一个一维矩阵 dp,其中 dp[i]表示数字最少可以由几个完全平方数相加构成。在本题中,位置i只依赖i- k2的位置,如i-1、i- 4、i-9 等等,才能满足完全平方分割的条件。因此 dp[i] 可以取的最小值即为 1 + min(dp[i-1],dp[i-4],dp[i-9]···)。
代码:
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
//注意边界条件
dp[0] = 0;
for(int i=1;i<=n;i++)
{
for(int k=1;k*k<=i;k++)
{
dp[i] = min(dp[i],dp[i-k*k]+1);
}
}
return dp[n];
}
};