题目描述:

给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

知识点:

  • 本质上是动态规划

解题思路:

  • 通过观察我们可以发现,将绳子分为长度为3最后的乘积便是最大的
  • 所以就有三种情况,就是刚好分完,剩下长度为2,剩下长度为4
  • 如果可以剩下长度为4那么就乘以4,如果剩下长度为2那么就乘以2

解题代码:

  1. if(number === 2) return 1;
  2. if(number === 3) return 2;
  3. let a = Math.floor(number / 3);
  4. let b = number % 3;
  5. switch(b) {
  6. case 0:return Math.pow(3,a);
  7. case 2:return Math.pow(3,a)*2;
  8. case 1:return Math.pow(3,a-1)*4;
  9. }
  • 递归版
    function cutRope(number)
    {
      if(number === 2) return 1;
      if(number === 3) return 2;
      let res = 1;
      while(number > 4) {
          res = res * 3;
          number -= 3;
      }
      return res * number;
    }