JAVA算法:剪绳子获得最大乘积 — 动态算法
给定一根长度为N米的绳子,以最大化所有部分长度的乘积的方式,将绳子切割成不同部分的整数长度。你必须至少切一刀。
假设绳索长度超过2米。
例如:
输入: n = 2
输出: 1 (获得的最大乘积是: 1*1)
输入: n = 3
输出: 2 (获得的最大乘积是: 1*2)
输入: n = 4
输出: 4 (获得的最大乘积是: 2*2)
输入: n = 5
输出: 6 (获得的最大乘积是: 2*3)
输入: n = 10
输出: 36 (获得的最大乘积是: 3*3*4)
问题分析
最优子结构
这个问题类似于木棒切割问题。我们可以通过在不同位置进行切割并比较切割后获得的值来得到最大的积。对于切割后获得的工件,我们可以递归调用相同的函数。
假设maxprod(n)是长度n的绳子的最大积。maxprod(n)可以写如下:
maxProd(n) = max(i*(n-i), maxProdRec(n-i)*i) 其中 i 的取值范围为: {1, 2, 3 .. n}
重叠的子问题
下面是这个问题的简单递归实现。实现只遵循上面提到的递归结构。
package com.bean.algorithm.basic;
public class CutForMaxProduct {
// Java program to find maxium product
// The main function that returns
// maxim