zoukankan      html  css  js  c++  java
  • 完全平方数-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];
    }
    本文为自己参考别人程序写的动态规划程序,存在很多不足,希望有好的点子的各位能够给予意见和建议

  • 相关阅读:
    centos shell运行报语法错误: 未预期的文件结尾
    腾讯云防暴力破解防异地登陆
    centos常用命令
    centos7安装nginx
    JavaScript数组倒序函数reverse()
    Ecshop首页购物车数量调取问题
    (原)IPhone开发时把ToolBar中的元素居中的技巧
    iphone开发常用代码笔记
    Windows环境下使用Apache+mod
    [转]C++中sizeof(struct)怎么计算?
  • 原文地址:https://www.cnblogs.com/sbb-first-blog/p/13174064.html
Copyright © 2011-2022 走看看