一、题目描述
给定一个正整数
n
,将其拆分为
k
个 正整数 的和
(k >= 2)
,并使这些整数的乘积最大化。
返回你可以获得的最大乘积 。
示例 1:
输入:
n = 2
输出:
1
解释:
2 = 1 + 1
,
1 × 1 = 1
示例 2:
输入:
n = 10
输出:
36
解释:
10 = 3 + 3 + 4
,
3 × 3 × 4 = 36
提示:
2 <= n <= 58
二、问题分析
- 确定dp数组及下标的含义:dp[i]的定义:分拆数字i,可以得到的最大的乘积dp[i]
- 确定递推公式:从1遍历到j;dp[i]可以从j×(i-j)得到,也可以从j×dp[i-j]的得到,所以递推公式:
dp[i]=max({dp[i],(i-j)×j,dp[i-j]*j})
- 初始化dp数组:初始化dp[0]和dp[1]没有意义,这里只初始化
dp[2]=1
三、代码实现
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
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 - 1; j++) {
dp[i] = max({ dp[i],(i - j) * j,dp[i - j] * j });
}
}
return dp[n];
}
int main() {
cout << integerBreak(10);
}