LeetCode 279 完全平方数

找完全平方数加和,哇赤裸裸的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<
                continue;
            }
            else{
                dp[i] = INT_MAX;
                //cout<<"before"<
                for(int j = 1; j <= (i/2); j++){
                    dp[i] = min(dp[j]+dp[i-j], dp[i]);
                }
            }
            //cout<

        }
        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();
    }
};

你可能感兴趣的:(算法分析与设计,LeetCode,动态规划,C++)