zoukankan      html  css  js  c++  java
  • [编程题] 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

  • 相关阅读:
    Go Map
    Go XORM
    Go切片
    Go函数
    dockerfile常用指令
    Goroutine并发控制
    Go 格式转换
    Go 常用知识点及实例
    Go 时间
    Go error
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13353284.html
Copyright © 2011-2022 走看看