给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
思路:递归方法
比如4,分割为1,2,3然后再考虑子问题即可,返回其中最大的即可。
class Solution {
private:
int max3(int a, int b, int c) {
return max(a, max(b, c));
}
int process(int n) {
if (n == 1)
return 1;
int res = -1;
for (int i = 1; i <= n-1; ++i) {
int temp = i * process(n - i);
res = max3(res, temp, i*(n - i));//不要忘记考虑i*(n-i)
}
return res;
}
public:
int integerBreak(int n) {
int res = process(n);
return res;
}
};
记忆搜索算法:
class Solution {
private:
vector<int>memo;
int max3(int a, int b, int c) {
return max(a, max(b, c));
}
int process(int n) {
if (n == 1)
return 1;
if (memo[n] != -1)
return memo[n];
int res = -1;
for (int i = 1; i <= n-1; ++i) {
int temp = i * process(n - i);
res = max3(res, temp, i*(n - i));//不要忘记考虑i*(n-i)
}
//res计算的就是memo[n]
memo[n] = res;
return res;
}
public:
int integerBreak(int n) {
memo = vector<int>(n + 1, -1);
int res = process(n);
return res;
}
};
动态规划:
class Solution {
private:
vector<int>memo;
int max3(int a, int b, int c) {
return max(a, max(b, c));
}
public:
int integerBreak(int n) {
assert(n >= 2);
//memo[i]表示将数字i分割(至少两部分)后得到的最大乘积
vector<int> memo(n + 1, -1);
memo[1] = 1;
for(int i = 2;i<=n;++i)
//求解memo[i]
for (int j = 1; j <= i - 1; j++) {
//将i拆分成j+(i-j)
memo[i] = max(memo[i],j*(i - j), j*memo[i - j]);
}
return memo[n];
}
};
更多:279,91,62,63