Problem
Solution
题意为:给定一个整数n,问n最少能由多少个完全平方数(1、4、9…)相加得到。
我的思路:
1、若n就是完全平方数,那么结果就是1
2、若n不是完全平方数,可以把n看成某个完全平方数t和n-t的和(其中我们并不需要知道n-t是不是完全平方数),由此可得状态转移方程dp[n]=dp[n-t]+dp[t],其中t是小于n的完全平方数。那么就需要去枚举所有小于n的完全平方数。
我自己的做法是用一个数组去存下目前所有的完全平方数(对应下面代码里的A)。在网上看到别人每次去枚举所有完全平方数(对应下面代码里的B)。两种枚举方法选其一即可。
class Solution {
public:
bool check(int n){
int sqr=(int)sqrt(n);
if(sqr*sqr==n) return true;
return false;
}
int numSquares(int n) {
int dp[n+1];
int sqr[n];
int cnt=1;
dp[0]=0;
dp[1]=1;
sqr[0]=1;
for(int i=2;i<=n;++i){
if(check(i)){
dp[i]=1;
sqr[cnt]=i;
cnt++;
}
else{
int temp=INT_MAX;
//A
for(int j=0;j<cnt;++j){
temp=temp<(dp[i-sqr[j]]+1)?temp:(dp[i-sqr[j]]+1);
}
//B
// for(int j=1;j*j<=i;++j){
// temp=temp<(dp[i-j*j]+1)?temp:(dp[i-j*j]+1);
// }
dp[i]=temp;
}
}
return dp[n];
}
};