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

题目:
剑指offer 牛客JZ67 剪绳子 动态规划_第1张图片

分析:
这个题目跟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];
    }
}

你可能感兴趣的:(算法)