题目描述
简单来说进行将一个数拆分成几个数的和使得这几个是数的乘积最大
动态规划五部曲
确定dp数组的含义
dp[i]表示正整数 i 可以获得得最大乘积
递推公式
求解递推公式得过程就是我们如何通过之前计算出来的最大乘积获得当前得最大乘积
比较好的类比就是数列的递推公式
首先来分析我们的dp[i]的最大乘积怎么得到,先明确需要的变量,由于必须要从1开始进行遍历(因为要求的最大乘积因此需要找到最大乘积所在,也就需要进行遍历)设为j
那么最大值来源于两个
dp[i-j] * j, j*(i-j) 因此递推公式也比较明朗
初始化
题目中说dp[2] = 1 因此初始化就是这个
遍历顺序
从前往后也比较明朗
找例子递推一下
代码实现
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-1; j++)
{
dp[i] = max(dp[i], max(j*(i-j), j*dp[i-j]));
}
}
return dp[n];
}
};