一、题目
给你一根长度为n
的绳子,请把绳子剪成整数长度的m
段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1]
。请问 k[0]*k[1]*...*k[m-1]
可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
答案需要取模1e9+7(1000000007),如计算初始结果为:1000000008,请返回1。
示例1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:
2 <= n <= 1000
注意:本题与主站 343 题相同:https://leetcode-cn.com/problems/integer-break/
二、思路
三、代码
1. 暴力
class Solution:
def cuttingRope(self, n: int) -> int:
res = 1
for m in range(2, n+1):
new_n = n
# 记录当前分法下的乘积
cur = 1
while m >= 2:
num, mod = divmod(new_n, m)
if mod == 0:
cur *= num**m
new_n = 1
# 可以等分,所以不需要再进行下去了
m -= m
else:
new_n -= num
cur *= num
m -= 1
cur *= new_n
if cur > res:
res = cur
return res % 1000000007
2. 动态规划
class Solution:
def cuttingRope(self, n: int) -> int:
dp = [0 for _ in range(n+1)]
for i in range(2, n+1):
for j in range(1, i // 2 + 1):
cur = max(j, dp[j]) * max(i-j, dp[i-j])
dp[i] = max(dp[i], cur)
return dp[-1] % 1000000007
四、表现
method | 运行时间 | 表现 | 内存消耗 | 表现 |
---|---|---|---|---|
1. 暴力 | 404ms | 35.80% | 13.3MB | 80.69% |
2. 动态规划 | 824ms | 26.14% | 13.5MB | 5.23% |