【学算法打卡】动态规划篇,整数拆分

整数拆分

新学到的

  1. 更新最大值:max=Math.max(max,Math.max(j*(i-j),jdp[i-j]));
    让max始终保持为整体的最大值
    易错写成,局部的Math.max(j
    (i-j),j*dp[i-j])
  2. 初始化:dp[0]dp[1]都是不用考虑的。
  3. 遍历,可以让索引表示 当n=索引的时候,拆完n的结果。遍历到n刚刚好。而j<=i-j, 假如拆 4,可以拆成 13 22 ,没必要再拆成31重复了。
  4. 看不出来了,就自己从小的数开始,推一推

代码

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];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值