剪绳子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循环中每次循环的最大值。想明白后发现我太愚蠢了,不过还好想明白了,希望下次在做时能够自己这样做出来。