[编程题] lc[剑指 Offer 14_ I剪绳子(动态规划)

[编程题] lc:剑指 Offer 14- I. 剪绳子

题目描述

image-20200721084829207

输入输出例子

image-20200721084840773

思路

方法1、从数据公式上探索

image-20200721084959629

image-20200721085814830

Java代码

class Solution {
    public int cuttingRope(int n) {

        //情况1:对于两种极端情况先讨论
        if(n==1 || n==2){return 1;}
        //情况2:对于n=3的时候,也是只能分成了2*1一种结果
        if(n==3){return 2;}
        //情况3:当n>3的时候,可分的情况就多了。如下
        int a = n/3;
        int b = n%3;
        //3.1如果是b=0
        if(b==0){
            return (int)Math.pow(3,a);
        }else if(b==1){
            return (int)Math.pow(3,a-1)*2*2; //3.2如果是b=1,把最后一个3和1 分为2*2的结果
        }else{
            return (int)Math.pow(3,a)*2;   //如果余数b=2的话,就直接乘在后边,不分了
        }
    }
}

输出的效率:

image-20200721094227217

方法2:动态规划

参考讲解:动态规划解决剪绳子问题

力扣社区

image-20200721094134280

Java代码

//方法2:动态规划
public int cuttingRope(int n) {
    int[] dp = new int[n + 1];

    //极端条件
    if(n==1 || n==2){
        dp[1] = 1;
        dp[2] = 1;
    }

    //遍历当绳子长度是3,4,5,...n的时候的情况,dp数组是存储之前的一些计算好的状态值的,空间换时间
    for (int i = 3; i <=n; i++) {
        for (int j = 0; j < i; j++) {
            //在java中max api中为2个参数,所以这里用两个max.本质是想max(dp[i],j*dp[i-j],j*(i-j))
            //后边 max中的两参数思想是:10分为了1和9,参数1:1*dp(9)  参数2:1*9
            dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)));
        }
    }
    return dp[n];
}

输出:

image-20200721094559483

原文地址:https://www.cnblogs.com/jiyongjia/p/13353284.html