欢迎光临散文网 会员登陆 & 注册

Leetcode Day5 2

2022-04-05 15:46 作者:我喜欢喝一点点  | 我要投稿

剑指 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] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。


嗯就是一个数学证明吧:

切分规则:

最优: 3 。把绳子尽可能切为多个长度为 3 的片段,留下的最后一段绳子的长度可能为 0,1,2 三种情况。

次优: 2 。若最后一段绳子长度为 2 ;则保留,不再拆为 1+1 。

最差: 1 。若最后一段绳子长度为 1 ;则应把一份 3 + 1 替换为 2 + 2,因为 2*2>3*1。


class Solution:
   def cuttingRope(self, n: int) -> int:
       if n<=3:return n-1
       if (n%3==0):return pow(3,n//3)
       elif(n%3==1):return  pow(3,n//3-1)*4
       else:return pow(3,n//3)*2

dp思路也可以,就是开了个N+1的数组:


Leetcode Day5 2的评论 (共 条)

分享到微博请遵守国家法律