动态规划中级教程 279. Perfect Squares

来源:互联网 发布:cf卡海豹突击队软件 编辑:程序博客网 时间:2024/06/06 05:22

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【8】=dp【4】+1(因为8-4)也是一个完全平方数

我们这里直接列状态转移方程

dp【i】=min(dp【i】,dp【i-j*j】)

class Solution {public:    int numSquares(int n) {        if(n<=0)return 0;        int num=sqrt(n);        int dp[n+1];        memset(dp,0,sizeof(dp));        for(int i=1;i<=num;i++)        {            dp[i*i]=1;        }        for(int i=1;i<=n;i++)        {            for(int j=1;j<=num;j++)            {                if(i-j*j>0)                {                    if(dp[i-j*j])                    {                        if(dp[i]==0)                        {                            dp[i]=dp[i-j*j]+1;                        }                        else                        {                            dp[i]=min(dp[i],dp[i-j*j]+1);                        }                    }                }            }        }         return dp[n];    }};

原创粉丝点击