zoukankan      html  css  js  c++  java
  • 剑指offer-剪绳子1

    题目描述

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

    示例 1:

    输入: 2
    输出: 1
    解释: 2 = 1 + 1, 1 × 1 = 1
    示例 2:

    输入: 10
    输出: 36
    解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

    我的一遍跑通的代码如下,但是算法复杂度不是很好

    class Solution {
        int[] c;
        public int cuttingRope(int n) {
            c = new int[n+1];
            c[0] = 0; c[1] = 0; c[2] = 1;
            int i_max = 0, temp = 0;
            for(int i=3;i<n+1;i++){
                i_max = 0;
                for(int j=1;j<=i/2;j++){
                    temp = j*(Math.max((i-j),c[i-j]));
                    if(temp>i_max){
                        i_max = temp;
                    }
                }
                c[i] = i_max;
            }
            return c[n];
        }
    }
    

    思路是动态规划的思路,把每个cuttingRope(i)从小到大记录下来,遇到一个新的i,它利用前面的进行计算求最大的,最后返回第c(n)即可。
    有60%的人使用了比这个好的方法,并不是思路不对,而是优化不够,有些规律没用到。接下来先上优化过的代码:

    class Solution {
        public int cuttingRope(int n) {
            if (n < 2) {
                return 0;
            } else if (n == 2) {
                return 1;
            } else if (n == 3) {
                return 2;
            }
    
            int numOfThree = n / 3;
            int result = 0;
            if (n % 3 == 1) {
                numOfThree -= 1;
                result =  (int) Math.pow(3, numOfThree) * 4;
            } else if (n % 3 == 2) {
                result =  (int) Math.pow(3, numOfThree) * 2;
            } else {
                result =  (int) Math.pow(3, numOfThree);
            }
            return result;
        }
    }
    

    有两条公理

    1. 绳子等分而得到的乘积最大
    2. 每段长度最好为3

    [a_1 ]

    [x^{a}=x^{frac{n}{x}}= (x^{frac{1}{x}})^{n} ]

    keep going
  • 相关阅读:
    WAF绕过方法
    ”非常危险“的Linux命令
    CSRF--花式绕过Referer技巧
    安卓手机的后门控制工具SPADE
    基于RedHat发行的Apache Tomcat本地提权漏洞
    SQL注入--宽字节注入
    MySQL提权
    CF1067D. Computer Game(斜率优化+倍增+矩阵乘法)
    CF1063F. String Journey(后缀数组+线段树)
    BZOJ4732. [清华集训2016]数据交互(树链剖分+线段树+multiset)
  • 原文地址:https://www.cnblogs.com/MarkKobs-blog/p/13404870.html
Copyright © 2011-2022 走看看