找完全平方數加和,哇赤裸裸的dp啊。
第一遍超時了 = =這種狀態遷移方程複雜度較高
第二遍膜了一遍題解區的大佬們代碼,漲知識遼,(vector原來可以這麼用)。
新的狀態遷移方程dp[i+jj]=min(dp[i+jj],dp[i]+1),每次一個普通數加上一個完全平方數的話就可以降低複雜度。
// 超時代碼 = =
class Solution {
public:
int numSquares(int n) {
int dp[n+1] = {INT_MAX};
dp[1] = 1;
for(int i = 1 ; i*i <= n ; i++){
dp[i*i] = 1; //自身就是完全平方數
}
for(int i = 1; i <= n ; i++ ){
if(dp[i] == 1) {
//cout<<i<<" "<<dp[i]<<endl;
continue;
}
else{
dp[i] = INT_MAX;
//cout<<"before"<<i<<" "<<dp[i]<<endl;
for(int j = 1; j <= (i/2); j++){
dp[i] = min(dp[j]+dp[i-j], dp[i]);
}
}
//cout<<i<<" "<<dp[i]<<endl;
}
return dp[n];
}
};
// new code
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
dp[0]=0;
for(int i=0;i<=n;i++){
for(int j=1;i+j*j<=n;j++){
dp[i+j*j]=min(dp[i+j*j],dp[i]+1);
}
}
return dp.back();
}
};