剑指 Offer 14- I. 剪绳子
题目描述:
给你一根长度为 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、java 中 Math.max()可求最大值。
2、在本题目中涉及数学推论:将绳子以相等的长度等分为多段 ,得到的乘积最大; 尽可能将绳子以长度 3 等分为多段时,乘积最大,因此,这种解法为:
class Solution {
public int cuttingRope(int n) {
if(n<=3) return n-1;
else{
int b = n%3;
int a = n/3;
int ans;
if(b == 0) return (int)Math.pow(3,a);
if(b == 1) return (int)Math.pow(3,a-1)*4;//注意这一步
else return (int)Math.pow(3,a)*2;
}
}
}
(注意if的用法,这里没有用else-if,所以直接用return返回数据跳出这个方法,如果用变量记录值,则会继续往下跑到else里造成结果错误)