給你一根長度爲n的繩子,請把繩子剪成整數長的 m 段(m、n 都是整數,n>1 而且 m>1,m<=n),每段繩子的長度記爲 k[1],...,k[m]。請問 k[1]x...xk[m] 可能的最大乘積是多少?例如,當繩子的長度是 8 時,咱們把它剪成長度分別爲 二、三、3 的三段,此時獲得的最大乘積是 18java
使用動態規劃來解決這道題目。考慮一點:若是分段數爲 target,那麼必然有一個點,把 target 分紅兩段,兩段分別構成最小子問題。而這兩段的最大值的乘積,也就是 target 所求的最大值。code
設劃分點爲 i,f[i] 表示長度爲 i 的繩子的乘積最大值。可得轉移方程:f[i] = MAX{f[j]*f[i-j]}
,其中 0 < j < iget
public class Solution { public int cutRope(int target) { int[] f = new int[target + 1]; // 初始化 f[0] = 0; f[1] = 1; for (int i = 1; i <= target; i++) { /** * 處理不分割的狀況,假設有f[6] * 那麼f[6]的最大乘積是3*3=9,那麼f[3]就不能被分割了 * 若是f[i] = i,證實最大就是它自己 * 除非到了target,不然不能分割 * 至於i==target將f[i]=1,是防止target自己就是最大 */ if(i==target) { f[i] = 1; }else { f[i] = i; } for (int j = 1; j < i; j++) { f[i] = Math.max(f[i],f[j]*f[i-j]); } } return f[target]; } }