1、题目描述:
2、题解:
方法1:动态规划
动态规划问题,弄清楚三点:
1、重复子问题;
2、最优子结构;
3、无后效性。
动态规划:
1、状态定义;
2、状态转移方程;
3、初始化;base case
4、输出;
5、思考状态压缩。
可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。
python代码如下:
class Solution:
def numSquares(self, n: int) -> int:
#动态规划
dp = [float('inf')] * (n + 1)
dp[0] = 0
for i in range(1,n+1):
j = 1
while i - j * j >= 0:
dp[i] = min(dp[i],dp[i - j * j] + 1)
j += 1
return dp[n]
C++代码如下:
class Solution {
public:
int numSquares(int n) {
// 动态规划
vector<int> dp(n + 1);
for (int i = 1;i<=n;i++){
dp[i] = i;
for (int j = 1;i - j * j >= 0;j++)
{
dp[i] = min(dp[i],dp[i - j * j] + 1);
}
}
return dp[n];
}
};