【Java语言】剑指offer系列之贪心、动态规划----剪绳子

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

具体代码实现如下:

public class Solution {
    public int cutRope(int target) {
      /*
       题意为:长度为n的绳子,切成m段:n=n1+n2+...+nm。求他们的最大乘积,即max(n1*n2*..*nm)
       当所有绳段长度相等时,乘积最大。经数学论证推导:最优的绳段长度为3.故尽可能的将绳子以长度为3的分割。
       当n≤3时,按照规则至少切成m(m>1)段,故必须有一个长度为1的绳子 返回n-1
       当n≥3时,n=3*a+b(a为n除以3的整数部分,b为余数部分)故最后会出现三种情况:
           1、b=0,那就是n刚好被分割为a个长度为3的绳段,乘积为3^a
           2、b=1,那就是被分割为a个3后还剩1,则返回(3^(a-1))*2*2,将余下的1和一个3取出来组成2*2,因为2*2>1*3
           3、b=2,那就是被分割成a个3后还剩2,乘积为3^a * 2
           */
        if(target <= 3) return target - 1;
        int a , b;
        a = target / 3;// 取整数部分
        b = target % 3;// 取余数部分
        if(b == 0) {
            return (int)Math.pow(3,a);
        }else if(b == 1){
            return (int)Math.pow(3,a-1) * 2 *2;
        }else{
            return (int)Math.pow(3,a) *2;
        }
        
    }
}

人生若只如初见,何事秋风悲画扇。
等闲变却故人心,却道故人心易变。
-----------纳兰性德

小白寄语:学如逆水行舟,不进则退。

你可能感兴趣的:(数据结构与算法基础,牛客网,剑指offer)