剑指Offer14- I. 剪绳子

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

示例 1:


输入: 2

输出: 1

解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:


输入: 10

输出: 36

解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

提示:


2 <= n <= 58

一解

使用动态规划, 设 DP 为最大乘积,其值等于切一刀(i为切分位置)后,切后的两段绳子的 DP 相乘:


DP[n] = DP[i] + DP[n-i]

由于切分位置有多个地方,需要找到最佳位置:


class Solution:

    def cuttingRope(self, n: int) -> int:

        if n == 2:

            return 1

        if n == 3:

            return 2

        dp = [ 0 for _ in range(n+1)]

        dp[1] = 1

        dp[2] = 2

        dp[3] = 3

        for i in range(4, n + 1):

            # 1*3 和 3*1 相同,只算一半就行 

            for j in range(1, i//2 + 1):

                dp[i] = max(dp[i], dp[j] * dp[i-j])

        return dp[n]

找规律比较简单方便

def cuttingrope(n):
    if n==2:
        return 1
    elif n==3:
        return 2
    else:
        if n%3==1:
            return (3**((n//3)-1))*2*2
        elif n%3==2:
            return 3**(n//3)*2
        elif n%3==0:
            return 3**(n//3)

print(cuttingrope(10))

这个是说,一定以3分乘积最大吗,为什么,有什么理论说明吗

应该有,但我不知道,我就是找规律发现 都是3和2的乘积最大 其他的取值,比如5肯定小于2x3,然后7也小于3x2x2,可能是因为3和2是最小的质数吧

并不简单,相信能看懂的同学并不多,数论技巧很难长时间记住,面试官也不会考你推断,如果不是数学专业,建议采用动态规划