動態規划解法:
package edu.bjtu.day8_27; /** * @author Allen * @version 創建時間:2017年9月23日 下午7:00:47 * 類說明: * 面試題14:剪繩子 * 題目:給你一根長度為n的繩子,請把繩子剪成m段(m和n都是整數,n>1並且m>1)每段繩子的長度記為k[0],k[1],...,k[m]. * 請問k[0]*k[1]*...*k[m]可能的最大乘積是多少? * 例如,當繩子的長度為8時,我們把它剪成長度分別為2,3,3的三段,此時得到的最大乘積是18. */ public class MaxCutingSolution { public static void main(String[] args) { System.out.println(maxCutting(5)); } public static int maxCutting(int length){ if(length<2) return 0; if(length==2) return 1; if(length==3) return 2; //子問題的最優解存儲在f數組中,數組中的第i個元素表示把長度為 ///i的繩子剪成若干段后各段長度乘積的最大值。 int[] f = new int[length+1]; //這些情況下,不剪的時候長度比剪的時候長,所以作為初始條件 f[0] = 0; f[1] = 1; f[2] = 2; f[3] = 3; int result = 0; for(int i = 4;i<=length;i++){ int max = 0; for(int j = 1;j<=i/2;j++){ int num = f[j]*f[i-j]; if(max<num) max = num; } f[i] = max; } result = f[length]; return result; } }
