leetcode 面试题14- II. 剪绳子 II(动态规划,中等,python)

题目:

在这里插入图片描述

题解:
分析题意:n > 1,m > 1;

经过简单分析可以得出,当绳子的长度n为2时,2可以剪成1和1的两段,所以最大乘积为1;n为3时,3可以剪成1和2的两段,所以最大乘积为2;
因此,在进行动态规划过程中,当绳子的总长度大于3时候,遇到长度为2和3的绳子就不再进行剪断;(2>1,3>2),以得到最大的乘积;

状态转移方程:

dp[i]表示绳子长度为i时,所能获得的最大乘积;
dp[i] = max(dp[i],dp[j] * dp[i - j])

代码思路分析

两层for循环。外层for循环实现绳子长度的动态变化,从4变到n,即首先计算出绳子长度为4的最大乘积,再依次往下进行;
内层for循环实现当前绳子长度i的动态分割,i//2 + 1的目的是绳子长度为5时,剪为2和3与3和2的乘积是一样的,避免重复计算;

class Solution(object):
    def cuttingRope(self, n):

    	if n == 2:
    		return 1
    	if n == 3:
    		return 2

    	dp = [0] * (n + 1)

    	#初始化
    	dp[0] = 0
    	dp[1] = 1
    	dp[2] = 2
    	dp[3] = 3

    	#两层循环的套路

    	for i in range(4,n + 1):


    		for j in range(0,i // 2 + 1):

    			dp[i] = max(dp[i], dp[j] * dp[i - j])

    	return dp[n] % 1000000007
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值