Integer Break
Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers.
Return the maximum product you can get.
For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
Note: you may assume that n is not less than 2.
Hint:
- There is a simple O(n) solution to this problem.
- You may check the breaking results of n ranging from 7 to 10 to discover the regularities.
思路:
num sum product
1 = 0+1 0
2 = 1+1 1
3 = 1+2 2
4 = 2+2 4
5 = 2+3 6
6 = 3+3 9
7 = 3+4 12
8 = 3+3+2 18
9 = 3+3+3 27
10 = 3+3+4 36
通过观察可以看到:从5开始最大乘积数都是由2 3组成的(4可以拆分2*2);
因此解法一:
public class Solution {
public int integerBreak(int n) {
if(n==2) return 1;
if(n==3) return 2;
int res = 1;
while(n>2) { //看n可以拆分出多少个3
res *= 3;
n -= 3;
}
if(n==0) return res; //n可以整除3,res就是各个3相乘
if(n==1) return (res/3)*4; // 余1,把其中的一个3加1变为4再相乘
if(n==2) return res*2; // 余2,则可直接把2与res相乘
return res;
}
}
动规解法:
由4以后的数字规律可以得出状态转移方程:
dp[i] = 3*dp[i-3],i>=7
因此解法二:
c++ code:
class Solution {
public:
int integerBreak(int n) {
vector<int> dp{0,0,1,2,4,6,9};
for(int i=7;i<=n;i++)
dp.push_back(3*dp[i-3]);
return dp[n];
}
};