整数拆分
新学到的
- 更新最大值:max=Math.max(max,Math.max(j*(i-j),jdp[i-j]));
让max始终保持为整体的最大值
易错写成,局部的Math.max(j(i-j),j*dp[i-j]) - 初始化:
dp[0]
和dp[1]
都是不用考虑的。 - 遍历,可以让索引表示 当n=索引的时候,拆完n的结果。遍历到n刚刚好。而j<=i-j, 假如拆 4,可以拆成 13 22 ,没必要再拆成31重复了。
- 看不出来了,就自己从小的数开始,推一推
代码
public int integerBreak(int n) {
int[]dp=new int[n+1];
dp[2]=1;
for(int i=3;i<=n;i++){
int max=0;
for(int j=1;j<=i-j;++j){
max=Math.max(max,Math.max(dp[i-j]*j,(i-j)*j));
}
dp[i]=max;
}
return dp[n];
}
public static int my_integerBreak(int n){
int[] dp={1, 2, 4, 6, 9, 12, 18, 27, 36, 54, 81, 108, 162, 243, 324, 486, 729, 972, 1458, 2187, 2916, 4374, 6561, 8748, 13122, 19683, 26244, 39366, 59049, 78732, 118098, 177147, 236196, 354294, 531441, 708588, 1062882, 1594323, 2125764, 3188646, 4782969, 6377292, 9565938, 14348907, 19131876, 28697814, 43046721, 57395628, 86093442, 129140163, 172186884, 258280326, 387420489, 516560652, 774840978, 1162261467, 1549681956,1549681956};
return dp[n-2];
}