完全平方数-leetcode279题

动态规划:

标签:动态规划
首先初始化长度为n+1的数组dp,每个位置都为0
如果n为0,则结果为0
对数组进行遍历,下标为i,每次都将当前数字先更新为最大的结果,即dp[i]=i,比如i=4,最坏结果为4=1+1+1+1即为4个数字
动态转移方程为:dp[i] = MIN(dp[i], dp[i - j * j] + 1),i表示当前数字,j*j表示平方数
时间复杂度:O(n*sqrt(n)),sqrt为平方根
作者:guanpengchn
链接:https://leetcode-cn.com/problems/perfect-squares/solution/hua-jie-suan-fa-279-wan-quan-ping-fang-shu-by-guan/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

个人理解:首先比较要分解的数M中是否包含平方数,因此用i-j*j来判断所分解的数包含几个相应的平方数。然后将要M分解成M=1+N的形式,比较dp[N]+1与dp[M]的大小关系,取二者较小值重新赋给dp[M]。在进行j的循环直到不满足条件为止。

例如:dp[4]第一次循环,i=4,j=1之后的结果为,dp[4]=minnum(dp[4],dp[3]+1);此时dp[4]=4(由前式推得dp[3]满足条件的情况为3=1+1+1,所以dp[3]=3);

然后,在进入j的循环中此时j=2;运行结果为,dp[4]=minnum(dp[4],dp[0]+1);此时dp[4]=1;

之后,进入j循环j=3,i-j*j>= 0不满足条件,所以跳出,执行下一组。求dp[5]

程序:

%%比较两个数的大小取小值

int min_num(int a,int b)
{
    if(a>b)
    {
        return b;
    }
    else
    {
        return a;
    }
}
%%进行完全平方和分解
int numSquares(int n)
{
    int* dp = (int*)malloc((n + 1) * sizeof(int));
    for (int i = 0; i <= n; i++) {
        dp[i] = i;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; i - j * j >= 0; j++) {
            dp[i] = min_num(dp[i], dp[i - j * j] + 1);
        }
    }
    return dp[n];
}
本文为自己参考别人程序写的动态规划程序,存在很多不足,希望有好的点子的各位能够给予意见和建议

猜你喜欢

转载自www.cnblogs.com/sbb-first-blog/p/13174064.html