减绳子II
题目要求
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]k[1]...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
算法分析
可以发现,剪成尽可能多的1会小,剪成2和4是一样的,剪成3长度是最大的,5开始都可以拆分成小的且乘积会变大,因此我们的目标是拆分出尽可能多的3,若出现1则换为一个4。
代码
class Solution(object):
def cuttingRope(self, n):
if n == 1 or n == 2:
return 1 #必剪一刀
if n == 3:
return 2 #必剪一刀
if n % 3 == 0:
return pow(3, n / 3) % 1000000007 #全拆成3长度的
elif n % 3 == 1:
return (pow(3, n / 3 - 1) * 4) % 1000000007 # 拆成全为3多出的一个1和前面i一个3凑出4
else:
return pow(3, n / 3) * 2 % 1000000007 #多出2乘上即可

浙公网安备 33010602011771号