问题描述
![](https://i-blog.csdnimg.cn/blog_migrate/b51c04ccb0fbb701eac65a55c8520af6.png)
解题报告
- 方案一:
d
p
[
i
]
dp[i]
dp[i] 表示拆分为至少两个正整数的和,并且最大化的乘积,则:
d
p
[
i
]
=
m
a
x
(
j
∗
(
i
−
j
)
,
j
∗
d
p
[
i
−
j
]
)
j
<
i
dp[i]=max(j*(i-j),j*dp[i-j])\;j<i
dp[i]=max(j∗(i−j),j∗dp[i−j])j<i
第一项表示分成两个整数之和;
第二项表示分成两个以上的整数之和
实现代码
- 方案一
class Solution{
public:
int integerBreak(int n){
vector<int>dp(n+1,1);
dp[1]=0;
dp[2]=1;
for(int i=3;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];
}
};
- 方案二
class Solution {
public:
int integerBreak(int n) {
vector<int> dp{0, 0, 1, 2, 4, 6, 9};
for (int i = 7; i <= n; ++i) {
dp.push_back(3 * dp[i - 3]);
}
return dp[n];
}
};