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