题解 | #剪绳子#
剪绳子
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
};

