剑指offer 牛客JZ67 剪绳子 动态规划

题目:
在这里插入图片描述

分析:
这个题目跟leetcode上的几道题目很像,都是一种组合问题
可看我的两篇博客
第一篇
第二篇

本题要求组合成targer的组合数中乘积最大的,用动态规划记录下求过的值。
动规数组表示的意思, dp[i]表示i这个数的所有组合中乘积最大是多少,子问题是什么,使用当前一个数字作为组合后,剩下的值的所有组合中乘积最大是多少
注意有几个特殊情况!!
当target <= 4的时候,(不包括1,因为题目要求切分段数m>1,m <= 长度target,自然猜测题目会以1进行输入),这时候可以直接返回值,因为target 1~4的答案显而易见
当targe >= 5的时候,又可以对1~4进行初始化,因为 >= 5的时候,如果子问题是1 ~ 4的话,那么1 ~ 4的答案也是显而易见的,就等于数值本身,因为题目要求切分段数 > 1,所以target>=5时,1 ~ 4成为了子问题,不用进行拆分是1 ~ 4的最优解
并不需要关心到底分了多少段,必定符合题目要求
使用双循环,相当于遍历所有组成target的组合情况

代码:

public class Solution {
    public int cutRope(int target) {
        if(target == 2){
            return 1;
        }else if(target == 3){
            return 2;
        }else if(target == 4){
            return 4;
        }
        int maxProduct = 0;
        int[] dp= new int[target+1];
        for(int i = 1; i <= 4; i++){
            dp[i] = i;
        }
        for(int i = 5; i <= target; i++){
            for(int j = 1; j < i; j++){
                dp[i] = Math.max(dp[i], j * dp[i - j]);
            }
        }
        return num[target];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值