剑指 Offer 14- I. 剪绳子python

题目描述:

 题解:动态规划

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值