题意
给定一个整数n( 2≤n≤58 ),将n拆成至少2个数,使这些数乘起来的积最大。
思路
首先,2,3的返回值要单独判断(因为2,3拆了后反而更小, 但是题目要求必须拆出来2个数)
然后,我们设d[i]为数i能够得到的最大积。我们再预处理d[2] = 2, d[3] = 3。然后从4开始循环到n,对每个数i,有 d[i]=max(d[i],d[j]∗d[i−j])1≤j<i 。
还有一种算法是拆出来尽可能多的3即可:http://blog.csdn.net/liyuanbhu/article/details/51198124
代码
#define LL long long
int d[100];
class Solution {
public:
int integerBreak(int n) {
if (n == 2) return 1;
if (n == 3) return 2;
d[2] = 2; d[3] = 3;
for (int i = 4; i <= n; i++) {
d[i] = 0;
for (int j = 1; j < i; j++) {
d[i] = max(d[i], d[j] * d[i - j]);
}
}
return d[n];
}
};