lt.343. 整数拆分
[案例需求]
[思路分析]
- 为什么想到DP, 如何切入?
- 对于的正整数 nn,当 n \ge 2n≥2 时,可以拆分成至少两个正整数的和。令 kk 是拆分出的第一个正整数,则剩下的部分是 n-kn−k,n-kn−k 可以不继续拆分,或者继续拆分成至少两个正整数的和。由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划求解。
DP五部曲
[代码实现]
class Solution {
public int integerBreak(int n) {
//n整数拆分
//1. dp数组, 当整数为n时拆分的最大乘积为dp[n + 1]
//2. 确定递推公式: i可拆分为j和i - j, i = j * (i - j);
//即i - j不再往下拆分
// 或者说 i = j * dp[i - j], i-j继续往下拆分
// dp[i] = max(i * (i - j), i * dp[i - j]);
//3. 初始化 dp[0] = 0, dp[1] = 0;
//4. 遍历顺序, i从1->n, j从1--> i- 1
int[] dp = new int[n + 1];
dp[0] = dp[1] = 0;
for(int i = 0; i <= n; i++){
for(int j = 0; j <= i - j; j++){
dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
}
}
return dp[n];
}
}