题目(leecode T343):
给定一个正整数 n
,将其拆分为 k
个 正整数 的和( k >= 2
),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
方法:
本题感觉属于有些难度的动态规划题目,递推公式有些难找并想全面。跟着五部法分析:
1:dp数组的含义:dp[i]代表整数i可以拆分的最大乘积
2:递推公式:想要获得dp[i]的最大乘积,需要一个j从1遍历,并计算j*(i-j)的值,这就相当于把i拆分为了两个整数的乘积,但具体拆分成几个是最大的我们并不知道。此时j已经从1开始遍历,肯定会取到所有的结果,因此我们只能拆分(i-j),去找寻(i-j)能拆分的最大乘积,而这个数字其实就是dp[i-j],因此我们的地推公式是dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))
3:初始化:因为0和1的拆分最大乘积是没有意义的,因此从2开始初始化,dp[2]=1;
4:遍历顺序:因为dp[i]依靠dp[i-j]的值,因此要从前往后遍历
5:举例推导:2到10的dp值为1 2 4 6 9 12 18 27 36
题解:
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] = max(dp[i], max(j * (i - j), j * dp[i - j])); //递推公式}}return dp[n];}
};