劍指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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章