【Hot 100】279. 完全平方数
目录
- 引言
- 完全平方数
- 我的解题
- dp总结
- 🙋♂️ 作者:海码007
- 📜 专栏:算法专栏
- 💥 标题:【Hot 100】279. 完全平方数
- ❣️ 寄语:书到用时方恨少,事非经过不知难!
引言
今天又是dp的题目,算法题做多了才会有自己的感悟。dp的题目就是和之前数学里面求数列的第n项的表达式一样。就是找出这个第n项的规律。dp也是这样,当前的状态由前面的状态决定(可能是前面一种状态,也可能是前面几种状态)。dp核心的地方就是找出这个状态转移方程。
完全平方数
- 🎈 题目链接:
- 🎈 做题状态:
我的解题
感悟了半天,发现自己找不到状态转移方程,尴尬了。
好了,看了一遍题解知道大概的思路了,先定义一下 dp[i] 表示和为 i 的完全平方数的最少数量。 完全平方数可能得组成在区间 [1, √i ] 之间,所以需要遍历这个区间的每个数。在遍历第一个数时,则另一个数就是 i-1^2 ,所以这个问题就变成了计算 dp[i-1^2] 这个数值的问题。然后在循环中 int j = 1 循环到 √i 即可计算, dp[i] = 1 + dp[i - j * j];
class Solution {
public:int numSquares(int n) {// 返回和为n的完全平方数的最少数量vector<int> dp(n+1);dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; ++i){// 找出最小值int minValue = INT_MAX;// 从1循环到√ifor (int j = 1; j * j <= i; ++j){minValue = min(minValue, dp[i - j*j]);}dp[i] = minValue + 1;}return dp[n];}
};
dp总结
-
DP 三要素的完整框架
状态定义:明确 dp[i] 的具体含义(如您的定义:dp[i] 表示和为 i 的最小完全平方数数量)。
转移方程:如何从子问题推导当前问题(如 dp[i] = min(dp[i - j²] + 1))。
初始条件:边界值的处理(如 dp[0] = 0,dp[1] = 1)。
-
DP 的两种实现方式
自顶向下(记忆化搜索):递归 + 备忘录,适合问题结构不直观时。
自底向上(迭代填表):您的代码采用的方式,更高效且避免递归开销。
-
常见 DP 类型
线性 DP(如斐波那契、爬楼梯)。
背包问题(0-1 背包、完全背包——完全平方数本质是完全背包)。
区间 DP(如矩阵链乘法)。
树形 DP(在树结构上动态规划)。