[Math_Medium]343. Integer Break
阿新 • • 發佈:2018-08-22
.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