leetcode279-Perfect Squares

问题描述:

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, …) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

给定一个正整数n,求相加等于n的完全平方数(例如 1, 4, 9, 16, … )的最小个数。

问题求解:

动态规划。时间复杂度:O(n * n)

状态转移方程:

dp[i+j*j]=min(dp[i+j*j],dp[i]+1);

动态规划核心点:第i步的dp,要么是第i步dp,要么是第i-1步的dp加上增长点。

class Solution {
public:
    /* 如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x = a + bxb, * 那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。 */
    int numSquares(int n) {
        vector<int> dp(n+1,0);
        for(int i=0;i<=n;i++)
        {
            dp[i]=i;//最多都由1组成
        }
        for(int i=0;i<=n;i++)
        {//从小到大找任意数i
            for(int j=1;i+j*j<=n;j++)
            {//从小到大找平方数j*j
                // 因为i+j*j可能本身就是平方数,所以我们要取两个中较小的
                dp[i+j*j]=min(dp[i+j*j],dp[i]+1);//要么本身,要么加一个平方数
            }
        }
        return dp[n];
    }
};

你可能感兴趣的:(dp)