题解 | #剪绳子#

剪绳子

http://www.nowcoder.com/practice/57d85990ba5b440ab888fc72b0751bf8

```function cutRope(number)
{
    // write code here 这是一道很经典的题
    //一.动态规划(递归):对于长度为n的绳子,剪第一刀时,有n-1种方式,剪出来的绳子长度可能从1到n-1
    //因此fn=fi*fn-1 0<i<n 选出不同i的最大乘积 对于剩下的绳子可以自上往下递归求解
    //但是以上太多重复子问题,另一种思路是从下往上,易得f2=1 f3=2。f4时,就是4了,可以切成2和2。
    if(number<2){return 0}
    if(number===2){return 1}
    if(number===3){return 2}
    //以上时父段绳子长度小于等于3的返回值,因为题目要求必须切一刀。而子段绳子为2或者3时没有切的必要,注意区分。
    let resArr=[0,1,2,3] //存储绳子某个长度的最大乘积值。因为对于子段绳子长度小于等于3时,没有切的必要,所以等于自身。
    //其实想明白这里可以用贪婪算法,具体参考其他解法
    for(let i=4;i<=number;i++){ //i++,表明自下而上
        let arr=[]
        for(let j=1;j<=i/2;j++){
           let temp =resArr[j]*resArr[i-j]
           arr.push(temp) //用数组记录对于长度i子段绳子不同切法的乘积值
        }
        let tempMax=Math.max(...arr) //得出对于i长度子段绳子的最大乘积值
        resArr[i]=tempMax //记录,给i增大后的递归作铺垫
    }
    return resArr[number]
}
module.exports = {
    cutRope : cutRope
};
全部评论
用贪婪算法,我们之间绳子剪不断
点赞 回复
分享
发布于 2021-11-23 23:19

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务