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.
Example 1:
Input: 2
Output: 1
Explanation: 2 = 1 + 1, 1 × 1 = 1.
Example 2:
Input: 10
Output: 36
Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36.
题目链接:https://leetcode-cn.com/problems/integer-break/
思路
这道题带一点点的数学分析:将数拆开再相乘取最大,肯定有拆的策略,需要看下如何拆乘积能更大。
2=1+1,=》1x1=1
3=1+2,=》1x2=2
4=1+3=2+2,=》2x2=4
5=1+4=1+2+2=2+3,-》2x3=6
算到这里可以发现,5拆开已经比它本身的值更大了,说明凡是大于5的数,都应该拆开。再验证下6:
6=3+3=2+4=2+2+2=1+2+3=1+1+4=1+1+1+3=1+1+1+1...
可以看出最不应该拆出1,应该拆出2、3,4因为能拆2,两种情况一样,所以归并到2里看。
于是转移方程就是得到当前数-2和-3的情况,取较大值。
class Solution {
public:
int integerBreak(int n) {
if(n==1) return 1;
if(n==2) return 1;
if(n==3) return 2;
int sum[n+1] = {0, 1, 2, 3};
for(int i=4; i<=n; ++i){
int sum2 = sum[i-2] * 2;
int sum3 = sum[i-3] * 3;
sum[i] = max(sum2, sum3);
}
return sum[n];
}
};