剑指Offer 14-II. 剪绳子II


一、题目

给你一根长度为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%

文章作者: Arvin He
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Arvin He !
评论
 本篇
剑指Offer 14-II. 剪绳子II 剑指Offer 14-II. 剪绳子II
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?
2020-10-29
下一篇 
剑指Offer 14-I.剪绳子 剑指Offer 14-I.剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?
2020-10-29
  目录