思路:
使用带有记忆化的动态规划dp
代码:
class Solution {
public int integerBreak(int n) {
int[] dp=new int[n+1];
//因为0和1都无法拆分,相乘为0,则从2开始,求部分最优解,一直到dp[n]
for(int i=2;i<=n;i++){
int max=0;
for(int j=1;j<i;j++){
max=Math.max(max,Math.max(j*(i-j),j*dp[i-j]));
}
dp[i]=max;
}
return dp[n];
}
}
分解:
1)线性规划,是dp的第一种形式,当前值只与前2个结果有关
2)核心代码
max=Math.max(max,Math.max(j*(i-j),j*dp[i-j]));
j*(i-j)表示不分解的当前值,例如:1和7
j*dp[i-j]表示分解的i-j,例如:1和7的分解后的值