【剑指 Offer 14- II. 剪绳子 II】【整数拆分】【Python】【动态规划】

剪绳子2和1的题目是一样的,只是2要求返回结果必须取余,要考虑大数越界。我16号的时候在力扣上做了剪绳子1,今天做2的时候已经完全没有记忆,看了力扣的题解也没记起来。看了16号的博客才发现原来当时是看了别人的视频写的,可以看这篇。当时理解的就不太好,所以今天也不出所料的没想出来,就连看到代码也不知道自己为什么这样写。又去看了一遍视频重新理解了一下。

class Solution:
    def cuttingRope(self, n: int) -> int:
        dp=[0 for _ in range(n+1)]
        for i in range(3,n+1):
            for j in range(i):
                dp[i]=max(dp[i],j*dp[i-j],j*(i-j))
        return dp[n]%1000000007

dp[i]表示长度为i的绳子分割后的最大乘积;
第二个循环中的j表示当第一段绳子长度为j,第一段绳子长度确定j那要求最大值就必须为dp[i],jdp[i-j],j(i-j)中的最大值。
我终于想明白了,我一直很疑惑为什么dp[i]=max(dp[i],jdp[i-j],j(i-j))中要加入dp[i]呢,最开始dp[i]的值不是不知道吗?我忽略了最开始定义dp=[0 for _ in range(n+1)],初始化的时候所有的dp中值都为0,如果不加入就会忽略第二个for循环中每次循环的最大值。想明白后发现我太愚蠢了,不过还好想明白了,希望下次在做时能够自己这样做出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值