剪绳子问题是剑指offer算法题中一道考察贪心和动态规划算法的题,在做这道题的时候有两种基本的做法:将绳子尽可能分成长度为3和2,并且优先3,另一种解法是动态规划解法;当时自己对于贪心和DP并不能区分的特别清楚,并且做完这道题还不能够完全理解,因此又借助网上资料才能窥得一二,记录如下。
题目:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
- 解法一:贪心算法
简单来说,就是将一段绳子分为m段,使得m段长度乘起来积最大,最直观的想法是子段肯定不是越长越好,假如不分,积就是他本身的长度(当然题干要求最少要分两段),那么就往小了分,但是1肯定不行,这样的话积就是1了,因此我们慢慢往上看:
对于2和3: 是先分2好,还是先分3好? 3*(n-3) > 2*(n-2) 求解出来是 n>5,也就是说n>5的时候分3比分2好
对于4:4的话先分3,那就是1*3=3,还不如不分,分2为2*2=4,所以4不分或者是分2一样,为了统一,我们遇到4就分成2+2
对于5: