剪绳子

public class Solution {
    public int cutRope(int target) {
        //动态规划
        //边界值处理
        if(target <2){
            return 0;
        }
        //将大问题拆分出小问题,为了避免从上到下切分的时候重复计算小问题。
        //故从下至上计算。将计算出来的值进行保存。
        if(target==2){
            return 1;
        }
        if(target == 3){
            return 2;
        }
        //创建一个数组用于存储小问题的值
        //因为target对应的值也要放进来,所以长度需要+1
        //该数组存放的是长度为索引值得时候,最大乘积是多少,最大乘积放到了相应索引值的位置
        int[] arr = new int[target+1];
        arr[0] = 0;
        arr[1] = 1;
        arr[2] = 2;
        arr[3] = 3;
        //从下往上开始判断
        for(int i = 4;i<=target;i++){
            //计算j的时候可以利用i作为基础,使用已经计算好的值
            int max = 0;
            for(int j=1;j<=i/2;j++){
                //利用arr[j]和arr[i-j]已经计算出来了。因为这j i-j都比i小
                //按照从小到大,所以肯定是已经计算出来了
                int res = arr[j]*arr[i-j];
                if(res>max){
                    max=res;
                }
                arr[i] =  max;
            }
           
        }
        return arr[target];
    }
}

 

posted @ 2019-11-21 22:46  会飞的企鹅吧  阅读(132)  评论(0编辑  收藏  举报