[Math_Medium]343. Integer Break

Posted qiulinzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Math_Medium]343. Integer Break相关的知识,希望对你有一定的参考价值。

原题: 343. Integer Break

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

解题思路:

我们知道,一个数,无论拆成多少项,当每一项都相等时,其乘积最大;假设我们将N拆成N/x个x,于是其乘积就是 x^(N/x),我们对这个乘积求导:
技术分享图片
可知,当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];
    }
};

以上





以上是关于[Math_Medium]343. Integer Break的主要内容,如果未能解决你的问题,请参考以下文章

343. Integer Break

343. Integer Break

Leetcode 343. Integer Break

LeetCode 343. Integer Break

leetcode [343]Integer Break

[leetcode] 343. Integer Break