DP逆向思維,第n步的解怎麼由上一步來的呢?第n-1步經過某種變換到第n步。這題讓我們學會重新定義上一步,目標是將n拆分成若干個x^2之和,所以上一步應該是n-x^2,那麼如何確定這個x呢,回顧題目:你需要讓組成和的完全平方數的個數最少,好的,那就是使得Sn-x^2 + 1 最小的那個x,x^2在1-n之間,所以就遍歷好了~
class Solution {
public:
int numSquares(int n) {
vector<int> base = vector(n+1,INT_MAX);
base[0] = 0;
for(int i=1;i<=n;i++){
for(int j=1;j*j<=i;j++){
if(base[i-j*j]+1<base[i]) base[i] = base[i-j*j]+1;
}
}
return base[n];
}
};