数学思路:
class Solution:
def cuttingRope(self, n: int) -> int:
# 最优情况是等分
# 每段为3最佳
# 如果是n<=3的情况,由于m取值要大于1,即必须至少有两段,则一段为1,另一段为n-1, 乘积为n-1
if n<=3:
return n-1
a,b = n//3,n%3
if b == 0:
# 刚好分完
return int(math.pow(3,a))
if b == 1:
# 前面 a-1段,把一段拿出来和最后的b=1这段放一起,3+1 -> 2 + 2
return int(math.pow(3,a-1)*4)
# 最后一段为2的情况
return int(math.pow(3,a)*2)
动态规划:
class Solution:
def cuttingRope(self, n: int) -> int:
# 动态规划
# 剪:分两段 j 和 i-j
# j 可分可不分 i-j 可分可不分
# 可分继续求解dp[j] 不可分即用j长度即可
dp = [0] * (n+1)
dp[1] = 1
dp[2] = 1
for i in range(3,n+1):
for j in range(1,i):
dp[i] = max(dp[i],(max(j,dp[j])*max(i-j,dp[i-j])))
return dp[n]