題目:
分析:
這個題目跟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];
}
}