码迷,mamicode.com
首页 > 其他好文 > 详细

[Math_Medium]343. Integer Break

时间:2018-08-21 22:41:18      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:求导   png   ges   个数   else   倒数   就是   规划   etc   

原题: 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

标签:求导   png   ges   个数   else   倒数   就是   规划   etc   

原文地址:https://www.cnblogs.com/qiulinzhang/p/9514441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!