题解 | #剪绳子#

剪绳子

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

function cutRope(number)
{
    // 动态规划
    // 首先定义一个长度为 n+1 的数组 dp,其中 dp[i] 表示长度为 i 的绳子剪成若干段后的最大乘积。
    // 显然dp[2]为1,因为长度为 2 的绳子只能剪成长度为 1 的两段,乘积为 1。dp[3]显然为2.
    // 接下来,从长度为 4 开始遍历到长度为 n 的绳子,对于每个长度 i,需要找到最佳的剪法来获得最大的乘积。在长度为 i 的绳子上,可以选择剪成长度为 j 和 i-j 的两段,此时乘积为 j * (i-j)。但是,对于长度为 i-j 的绳子,可以选择继续剪,也可以不剪,因此最大乘积为 j * dp[i-j] 和 j * (i-j) 中的最大值。
    if(number === 2) return 1;
    if(number === 3) return 2;
    let dp = [0, 0, 1, 2];
    // 分别计算绳子长度大于等于4时的最大乘积
    for(let i = 4; i <= number; i++){
        // 定义保存乘积结果的数组
        let res = [];
        // 对于每个长度的绳子查找最大乘积
        for(let j = 1; j <= Math.floor(i / 2); j++){
            let product1 = j * (i - j);
            // 在j固定的情况下,显然dp[i - j]值越大,乘积越大,分解为子问题。
            let product2 = j * dp[i - j];
            res.push(Math.max(product1, product2));
        }
        dp[i] = Math.max(...res);
    }
    return dp[number];
}
module.exports = {
    cutRope : cutRope
};

全部评论

相关推荐

你背过凌晨4点的八股文么:简历挂了的话会是流程终止,像我一样
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务