整数拆分
动态规划
- 确定dp数组的含义:dp[i]表示数i可以拆分的到的最大乘积。
- 递推公式 dp[i] 取 j*(i-j) j*dp[i-j] 中大的一个;j的取值 从 1到 i-1 (j表示可以拆分成的数)
- dp的初始化 dp[1]=0 dp[2]=1
- 确定遍历顺序 i(3–>n) j(1–>i-1)
- 推导一遍
优化:j的取值,可以从 j(1–>i-1) 优化到 (1–>1/2) ,因为相乘的两个数肯定要比较接近才会使得结果更大。
public int integerBreak(int n) {
int[] dp = new int[n+1];
dp[2] = 1;
for(int i = 3; i <= n; i++){
for(int j = 1;j <= i/2;j++){
dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j]));
}
}
return dp[n];
}