1 | 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 |
自顶向下的动态规划
对于一根长度为n的绳子,当n为1和2时,结果只能是1,当n大于2时,有两种处理方式:
- 先把它在i处切一刀,然后将继续切割剩下的绳子,当前的值是$i*cut(n-i)$;
- 把它在i处切一刀,不再继续切割剩下的绳子,当前的值是$i(n-i)$;
为了最大化乘积,需要选择二者中较大的那种切割方法因此$Math.max(i*cut(n-i),i(n-i))$;
1 | class Solution { |
非递归实现
- 切的时候,当前的问题是切下来的长度
i
乘以剩余部分的子问题dp[i-j]
的结果 - 不切的时候,当前的问题是
j*(i-j)
1 | class Solution { |
相关题目
参考文献