一:题目
二:上码
class Solution {
public:/**思路:1.分析题意:将一个数拆分为几个数相加的和 然后求取这几个数相乘的最大积,这个就很动态规划也就是我们可以得到多种结果,要在多种结果中取最优2.动态规划:1>:确定dp数组代表啥,以及下标的含义dp[i]代表的就是最大乘积数,i代表的就是n2>:确定dp数组的状态递推公式我们将i划分为多个数的和那么此时可以分为两种情况(两个数 / 多个数)两个数: 我们将i划分为 j 和 i-j(这里特别声明j就是我们划分的数值) ==> i = j + (i-j);多个数: 那就将i划分为 j 但将(i-j)进行继续划分 ==> i = j + dp[i-j];这里我们的j的取值范围是[1,i-1];(因为j是划分的数值,那你最少得取值为1吧,同时也不能取值为i吧)dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j]));//因为j的数值不同,那么dp[i]也不同所以也要求取其最值3>:确定dp数组的初始化i>=2的 那么dp[2] = 1;4>:确定dp数组的遍历顺序肯定从前向后遍历 (比如10 还需要用到3的最大乘积呢);5>:举例验证*/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];}
};
从没思路 到看题解看不懂 再到看了好多题解懂了 再到自己写出来 见证了我的喜怒哀乐
安 各位!