剑指Offer_剪绳子
原题:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/
给你一根长度为 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。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例 2:
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:
2 <= n <= 58
思路一:很简单的动态规划问题
package com.heima.day01;
public class CutRope_1 {
public static void main(String[] args) {
System.out.println(maxAfterCutting(15));
}
public static int maxAfterCutting(int length) {
if (length == 2) {
return 1;
}
if (length == 3) {
return 2;
}
int[] A = new int[length + 1]; // 将最优解存储在数组中
// 数组中第i个元素表示把长度为i的绳子剪成若干段之后的乘积的最大值
A[0] = 0;
A[1] = 1;
A[2] = 2;
A[3] = 3;
int max = 0;
for (int i = 4; i <= length; i++) { //i表示长度
max = 0;
for (int j = 1; j <= i / 2; j++) { //由于长度i存在(1,i-1)和(i-1,1)的重复,所以只需要考虑前一种
int result = A[j] * A[i - j];
if (result > max) {
max = result;
}
}
A[i] = max;
}
return A[length];
}
}
思路二:数学分析
有点类似于基本不等式,
(1)拆质数时:取最值往往是相等时,所以我们尽量要拆为多个相同的数相乘 , 如有余数1,那再加到最后
(2)拆非质数时:先拆为质数相乘 , 然后就可以用(1)来判断了
例如: