题目
-
给你一根长度为n的绳子,请把绳子剪成m段(m , n )都是正整数,(n>1&m>1)
-
每段绳子的长度为k[0],k[1],k[2],…,k[m]。请问k[0]k[1]k[2]…k[m]的最大值。
-
例如绳子是长度为8,我们把它剪成的长度分别为2,3,3的三段,此时得到的最大的乘积是18。
-
leetcode链接1:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/
-
leetcode链接2:https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/
思路
- 动态规划
- 贪心算法
// 动态规划,只适用于链接1
var cuttingRope = function (n) {
// dp[i] 表示i可以拆分的最大乘积是多少
// dp[i] = Math.max(dp[i], dp[i - k] * k, (i - k) * k)
const dp = new Array(n + 1).fill(-Infinity)
dp[2] = 1
for (let i = 3; i <= n; i++) {
for (let k = 1; k < i; k++) {
if (i - k < 2) break
dp[i] = Math.max(dp[i], dp[i - k] * k, (i - k) * k)
}
}
return dp[n]
}
console.log(cuttingRope(10))
// 贪心算法
/**
* @param {number} n
* @return {number}
* n >= 2
*/
var cuttingRope = function (n) {
if (n < 4) return n - 1
let result = 1
while (n > 4) {
result = (result * 3) % 1000000007
n -= 3
}
return (result * n) % 1000000007
}