leetcode 279. Perfect Squares

来源:互联网 发布:win7 java 编辑:程序博客网 时间:2024/05/16 09:22

DP问题。

题意:

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.

题解:写出状态转移方程,

dp[n]=min{dp[n-i*i]}+1,其中i>=1&&i<=sqrt(n)。

代码如下:

class Solution {public:    int numSquares(int n) {        vector<int> dp(n+1);        dp[0]=0;        dp[1]=1;        int min;        for(int i=2;i<=n;i++){            min=INT_MAX;            for(int j=sqrt(i);j>=1;j--){                if(dp[i-j*j]<=min)                    min=dp[i-j*j];            }            dp[i]=min+1;        }        return dp[n];    }};

击败了56%的cpp提交者。

下面贴一下某大牛写的12ms的代码。

class Solution {public:    int numSquares(int n) {        /*** first: you must initialize the dp-array ***/        static vector<int> dp({0});        /*** the-array-start-from-1 ***/        if(dp.size() >= n+1)  return dp[n];        /*** dp[n] means the dp.size()=n+1 ***/        while(dp.size()<=n+1){            /*** the-j-should-start-from-1 ***/            int temp=INT_MAX;            for(int j=1; j*j<=dp.size(); j++)                temp=min(temp, dp[dp.size()-j*j]+1);            dp.push_back(temp);        }        return dp[n];    }};


0 0