题解 | #剪绳子#

剪绳子

https://www.nowcoder.com/practice/57d85990ba5b440ab888fc72b0751bf8

class Solution:
    def cutRope(self , n: int) -> int:
        # write code here
        dp = [ 0 for _ in range(n+1)]
        for i in range(2,n+1):
            for j in range(1,i):
                dp[i] = max(dp[i],j*max(dp[i-j],i-j))
        return dp[-1]

首先要找到n前面所有绳子的剪开乘积:

第一个for循环:从2开始到n长度的绳子的所有情况,当前绳子为长度为i的绳子;

再找到当前对应的绳子的动态转移方程:

第二个for循环:长度为i的绳子,剪开的所有剪法是i-1种,从剪下1一直到剪下i-1,这个数字记为j

动态转移方程:

长度为i的绳子,剪下来的最大乘积,要从这i-1种剪法中找。

1.首先判断dp[i-j]与i-j的最大值

(1)长度i的绳子剪下长度j后,比较:长度为i-j的绳子的本身长度 vs 长度为i-j绳子的剪后最大乘积

(2)最大值为我们需要的i-j长度绳子的最大乘积

2.其次判断对于长度为i绳子的最大乘积

(1)根据上述分析,需要将剪下的长度j和对应的剩余最大乘积累乘在一块,即j*max(dp[i-j],i-j)

(2)其次,取所有的j取值(j=1,...,n-1)的最大值:max(dp[i],j*max(dp[i-j],i-j))

因此,最后的转移方程为:dp[i] = max(dp[i],j*max(dp[i-j],i-j))

最后返回dp数组中的最后一位即可。

全部评论

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务