动态规划
- 思路:
- 假设 dp[i] 为最少组成数 i 的平方数个数;
- 则其上一个状态为 dp[i - j^2] + 1,1 为 j^2:
- 即 i 的最少完全平方数 = i - j^2 的最少完全平方数 + 1,其中 j^2 <= i 为最接近 i 的平方数;
- 初始值:dp[0] = 0
- 所以,可以通过动态规划算出每一个 dp[i]
class Solution {
public:
int numSquares(int n) {
std::vector<int> dp(n + 1);
dp[0] = 0;
for (int i = 1; i <= n; ++i) {
int minn = INT_MAX;
for (int j = 1; j * j <= i; ++j) {
minn = std::min(minn, dp[i - j * j]);
}
dp[i] = minn + 1;
}
return dp[n];
}
};
——————————————————————————————