6.4 分割类型题
279. Perfect Squares
题目描述
给定一个正整数,求其最少可以由几个完全平方数相加构成。
输入输出样例
输入是给定的正整数,输出也是一个正整数,表示输入的数字最少可以由几个完全平方数相加构成。
Input: n = 13
Output: 2
在这个样例中,13 的最少构成方法为 4+9。
题解
对于分割类型题,动态规划的状态转移方程通常并不依赖相邻的位置,而是依赖于满足分割条件的位置。我们定义一个一维矩阵 dp,其中 dp[i] 表示数字 i 最少可以由几个完全平方数相加构成。在本题中,位置 i 只依赖 的位置,如 i - 1、i - 4、i - 9 等等,才能满足完全平方分割的条件。因此 dp[i] 可以取的最小值即为 1+ min(dp[i-1], dp[i-4], dp[i-9] · · · )。注意边界条件的处理。
- C++
- Python
int numSquares(int n) {
vector<int> dp(n + 1, numeric_limits<int>::max());
dp[0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j * j <= i; ++j) {
dp[i] = min(dp[i], dp[i - j * j] + 1);
}
}
return dp[n];
}
def numSquares(n: int) -> int:
dp = [0] + [sys.maxsize] * n
for i in range(1, n + 1):
for j in range(1, int(floor(sqrt(i))) + 1):
dp[i] = min(dp[i], dp[i - j * j] + 1)
return dp[n]