剪绳子 --剑指offer

题目描述

给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
 
思路:尽可能多的剪成长度3的绳子 然后建成2的  有一点注意的是 如果剩4的话 建成2*2 比 3*1 好
public class Solution {
    public int cutRope(int target) {
        if(target <= 1) return 0;
        if(target == 2) return 1;
        if(target == 3) return 2;
        int x=target/3;
        int y=target%3;
        if(y == 1) {
            return 4*(int)Math.pow(3,x-1);
        }
        else if(y == 2){
            return 2*(int)Math.pow(3,x);
        }else {
            return (int)Math.pow(3,x);
        }
    }
}

 动态规划也可以

将这个长度分为两半 当前长度乘积最大就等于两半分别的乘积最大  -》最优子结构和子问题重叠 

public class Solution {
    public int cutRope(int target) {
        if(target <= 1) return 0;
        if(target == 2) return 1;
        if(target == 3) return 2;
        int[] project=new int[target+1];
        project[0]=0;
        project[1]=1;
        project[2]=2;
        project[3]=3;
        for(int i = 4;i <= target;i ++){
            int max=0;
            for(int j = 1;j <= i/2;j ++){
                max=Math.max(max,project[j]*project[i-j]);
            }
            project[i] = max;
        }
        return project[target];
    }
}

 

posted @ 2020-03-13 00:21  nlw  阅读(189)  评论(0编辑  收藏  举报