经典的动态规划和贪婪算法
- 动态规划
- 思路:长度2有0种,长度3可以分成1,2或者1,1,1,有两种,长度4有三种,将最优解存起来,第二个循环根据前面的最优解找到本次的最优解存起来
function cutRope(number) { // write code here if(number<=3){ return number-1 } //记录每一个number的乘积的最大值 let arrMax=[0,1,2,3] let max=0 //第一个循环往arrMax填入最大值 for(let i=4;i<=number;i++){ max=0 //第二个循环找出最大值 for(let j=1;j<=i/2;j++){//分成左右两部分 //右半部分和左半部分乘积 let multi=arrMax[j]*arrMax[i-j] max=Math.max(multi,max) } arrMax[i]=max//最大值记录 } max=arrMax[number] return max }
- 贪心算法
- 思路:如果超过5的话,那么其实都拆分成了3 和 2 因为3(n-3)>n,3(n-3)>=2(n-2)
所以我们全部拆分成3 或者 2
如果是10,那么不能拆分成3 3 3 1 而要拆分成 3 3 2 2function cutRope(number) { // write code here if(number<=3){ return number-1 } let countOf3=~~(number/3) if(number-countOf3*3==1){ countOf3-- } let countOf2=~~((number-countOf3*3)/2) return Math.pow(3,countOf3)*Math.pow(2,countOf2) }