问题描述
动态规划问题总结![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f2683bd552e7bc9d7811e8016d2b058f.png)
问题
leetcode 343. Integer Break
Given an integer n, break it into the sum of k positive integers, where k >= 2, and maximize the product of those integers.
Return the maximum product you can get.
Example 1:
Input: n = 2
Output: 1
Explanation: 2 = 1 + 1, 1 × 1 = 1.
Example 2:
Input: n = 10
Output: 36
Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36.
分析
代码
递归+记忆中间结果
class Solution {
public:
vector<int> memory;
int integerBreak(int n) {
memory = vector<int> (n+1, -1);
return maxSum(n);
}
int maxSum(int n) {
if (n == 1) return 1;
if (memory[n] != -1) return memory[n];
int sum = 0;
for (int i = 1; i < n; i++) {
sum =max(sum, max(i * (n-i), i * maxSum(n-i)));
}
memory[n] = sum;
return sum;
}
};
动态规划
class Solution {
public:
int integerBreak(int n) {
assert(n > 1);
vector<int> dp = vector<int>(n+1, -1);
dp[1] = 1;
dp[2] = 1;
//n至少可以拆分成两个正整数
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
dp[i] = max(dp[i], max(j *(i - j), j * dp[i-j]));
}
}
return dp[n];
}
};