2023.8.10
本题用dp算法来做,dp[i]代表的含义是:当前数字i 在拆分之后所能获得的最大乘积 。然后由于n>=2,所以dp[0]和dp[1]没有意义,不用初始化,直接初始化dp[2]= 1。 然后再遍历给dp数组赋值:dp[i]的来源有两个:①将i拆成 j 和 (i - j) ,然后相乘,即j*(i-j) 。 ② 将i 拆成 j 和(i-j), 然后(i-j)的最大拆分乘积为dp[i-j],即j * dp[i-j]。
思考画的草图:
代码如下:
cpp
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n+1); //dp[i]的含义是:当前数字i拆分之后的最大乘积值。
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];
}
};