第六题:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
dp[i]:拆分 i 得到的最大乘积;
拆数的时候尽可能拆成相同的数得到的乘积最大;
如果拆成 j * (i - j) ,就是拆成两个数相乘;如果拆成 j * dp[i - j],就是拆成两个以上数相乘,相当于拆分i - j;
dp初始化,dp[0] = 0,dp[1] = 0,dp[2] = 1;
for (int i = 3; i <=n; i++) {
for (int j = 1; j < i; j++) {
dp[i][j] = max(dp[i-j] * dp[j], (i-j) * j, dp[i][j])
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n+1);
dp[2] = 1;
for (int i = 3; i <= n; i++) {
for (int j = 1; j <= i/2; j++) {
//对于每个dp[i]都有拆成哪个数的考虑,因此j需要遍历[1, i/2],j>i/2的情况与之前的重复,所以只需要遍历到i/2就可以
//正是因为dp[i]在遍历j的过程中一直在变化,所以需要记录遍历以来dp[i]的最大值
dp[i] = max(dp[i], max(dp[i-j] * j, (i-j) * j));
}
}
return dp[n];
}
};