題目:給你一根長度爲n的繩子,請剪成m段n>1,m>1,使剩下的繩子乘積爲最大值.
例:8 => 2 * 3 * 3 = 18
思路:動態規劃,比如8,第一次切割可以分成8-1種切法,將最優解存儲起來。
let n = 8;
function cut(){
let res = [0,1,2,3];
return function(n){
if(n<4){return n-1;}
if(res[n])return res[n];
let max = 0;
for(let i = 4;i<=n;i++){
max = 0;
for(let j = 1;j<=i/2;j++){
let p = res[i-j] * res[j];
max = max < p ? p : max
}
res[i] = max;
}
return res[n];
}
}
let f = cut();
f(n);
使用閉包存儲數組.
思路2:貪婪算法,如果超過5的話,那麼其實都拆分成了3 和 2 因爲3(n-3)>n,3(n-3)>=2(n-2)
所以我們全部拆分成3 或者 2
如果是10,那麼不能拆分成3 3 3 1 而要拆分成 3 3 2 2
function cut2(n){
if(n<4)return n-1;
let len = ~~(n/3);
if(n-len*3 == 1)len--;
let len2 = ~~((n-len*3)/2)
return Math.pow(2,len2)*Math.pow(3,len);
}