版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/artisans/article/details/89007952
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例 2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
class Solution {
public:
int numSquares(int n) {
const int VALUE = INT_MAX - 100;
vector<int> dp(n+1, VALUE);
dp[0] = 1;
dp[1] = 1;
int pre = 1, delta = 3;
for (int i = 2; i <= n; i++)
{
if(i == pre + delta)
{
dp[i] = 1;
pre = i;
delta += 2;
}
else
{
int minV = VALUE;
int PRE = 0, DELTA = 1;
for (int k = i -1; k >= 1; k--)
{
int var = (i - k);
if (var == PRE + DELTA)
{
minV = std::min(minV, dp[k]);
DELTA += 2;
PRE = var;
//cout << var << endl;
}
}
dp[i] = minV + 1;
}
}
return dp.back();
}
};