zoukankan      html  css  js  c++  java
  • [Math_Medium]343. Integer Break

    原题: 343. Integer Break

    题目大意:给你一个数(2-57), 将这个数拆成若干项(和不变),使其乘积最大。

    解题思路:

    我们知道,一个数,无论拆成多少项,当每一项都相等时,其乘积最大;假设我们将N拆成N/x个x,于是其乘积就是 x^(N/x),我们对这个乘积求导:
    求导.png
    可知,当x=e时,倒数为0,此时函数取得最大值,而我们在这里只能取整数,所以可以取2或者3,但是我们发现 2x2x2 < 3x3,所以我们应该尽可能地取3,所以代码如下:

    源代码:

    class Solution{
        public:
        int integerBreak(int n)
        {
            if(n==2)
                return 1;
            else if(n==3)
                return 2;
            else
            {
                int ans=1;
                while(n>4)
                {
                    ans*=3;
                    n-=3;
                }
                ans*=n;
                return ans;
            }
        }
    };
    

    这里也可以使用动态规划的方法:
    设dp[i]为数值 i 拆分后的最大值,我们就取max(dp[i], dp[i-j] * j)
    代码如下:

    class Solution{
        public:
        int integerBreak(int n)
        {
              vector<int> dp[n+1,1];
              for(int i=3;i<dp.size();i++)
                  for(int j=2;j<i;j++)
                        {
                              if(dp[i]<(dp[i-j]*j))
                                  dp[i]=dp[i-j]*j;
                              if(dp[i]<i*(i-j))//因为初始化值为1,所以要先一个一个拆开赋值
                                   dp[i]=i*(i-j);
                       }
                   return dp[n];
        }
    };
    

    以上

  • 相关阅读:
    Spark 基本概念及入门
    Cron 表达式详解
    VmWare 网络模式
    微信、支付宝各种支付退款
    Spring Security OAuth2 SSO 单点登录
    Git 入门详解
    基于Spring Boot 2.x 的 Spring Cloud Admin 实践
    Git 提交规范
    Linux 安装 Mysql8.0
    Docker入门
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/9514441.html
Copyright © 2011-2022 走看看