1)题目
剪绳子
要求:
给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,n > 1 并且m > 1),每段绳子的长度记为k[0], k[1], …k[m]。请问k[0] x k[1] x … x k[m]可能的最大乘积是多少?
例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
2)思路
总体来分两种
-
思路一: 运用动态规划算法求解,若一根长为n的绳子剪第一刀的时候,则有1,2,3,…,n-1种选择,运用归纳法,则剪出来的两段绳子最大长度乘积为 f ( n ) = m a x ( f ( i ) ∗ f ( n − i ) ) f(n)=max(f(i)*f(n-i)) f(n)=max(f(i)∗f(n−i)),其中 0 < i < n 0<i<n 0<i<n。得到这个公式以后,我们就可以利用自下而上的方式来解决这个问题,利用一个数组来储存长度为i的绳子剪成若干段的各段长度乘积的最大值。 设 定 f ( 0 ) = 0 , f ( 1 ) = 1 , 可 以 求 得 f ( 2 ) = 2 , f ( 3 ) = 2 设定f(0)=0,f(1)=1,可以求得f(2)=2,f(3)=2 设定f(0)=