题目描述:
题解:动态规划
1.如果输入n=2,返回1,输入n=3,返回2.
2.dp[i]表示长度为i可以得到的最大乘积,dp[1]=1,dp[2]=2,dp[3]=3,因为对于n=2 3的情况,最大值是不做切分,如果输入n<3,已经直接返回,dp是为了确定n>=4的最大乘积。
3.n>=4时,对于i取值从1到i//2,取最大的dp[i-j]*dp[j]
class Solution: def cuttingRope(self, n: int) -> int: if n==2: return 1 if n==3: return 2 dp = [0 for i in range(n+1)] dp[1] = 1 dp[2] = 2 dp[3] = 3 for i in range(4,n+1): for j in range(1,i//2+1): dp[i] = max(dp[i],dp[j]*dp[i-j]) return dp[n]
题解二:数学
参考:力扣
核心:将n长度的绳子尽可能切分为多个长度为3的段。 n处以3商为a,余数为b: 若b=0,返回3**a 若b=1,返回3**(a-1)*2*2 即将最后一个3和余数1划分为两个2 若b=2,返回3**a*2 class Solution: def cuttingRope(self, n: int) -> int: if n<=3: return n-1 a = n//3 b = n % 3 if b==0: return 3**a if b==1: return 3**(a-1)*4 if b==2: return 3**(a)*2