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

题目:

leetcode 面试题14- II. 剪绳子 II(动态规划,中等,python)_第1张图片

题解:

分析题意: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

你可能感兴趣的:(leetcode)