剑指offer 剪绳子详解
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。(来自牛客网)题目链接: link.
毫无疑问,这道题是一道贪心算法的题目,需要我们在每一种m(段数)下取最大值。此时问题可以转化为对于每种分法下所有分段绳子乘积的最大值。这时候我们可以采取一种转移学习的思想,长方形面积取得最大值时正是当长和宽都相等时,如此一来,我们需要尽量将绳子平均分到m段绳子上。
class Solution:
def cutRope(self, number):
dp=[0]*(number+1)
dp[number]=number
for m in range(2,number):
a=number//m #获得m段绳子基础长度
t=number%m #余下的长度,然后平均分到相同的t段绳子上
q=m-t #没有获得补充的绳子
dp[m]=pow(a,q)*pow(a+1,t)
return max(dp)
如代码所示,我们先平均分割绳子,然后再将剩下的绳子长度平均分到与其一致的段数上,然后相乘即可得出结果。
Github代码链接: link.