1. 程式人生 > >[Math_Medium]343. Integer Break

[Math_Medium]343. Integer Break

.com alt load 題目 ans edi href 可能 script

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