美文网首页
刷题笔记

刷题笔记

作者: 楚_kw | 来源:发表于2019-05-09 18:49 被阅读0次

    题目描述

    343 - Integer Break
    Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.
    剪绳子

    Example 1:

    Input: 2
    Output: 1
    Explanation: 2 = 1 + 1, 1 × 1 = 1
    

    Example 2:

    Input: 10
    Output: 36
    Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
    

    解题思路

    • 动态规划

    大问题可以转化为各个子问题的最优解,应该要想到思路是动态规划,也就是要自底向上开始,且应该有 f(n) = Max(f(i)*f(n-i)) ,代码如下:

    public int integerBreak(int n) {
            if(n < 2) return 0;
            if(n == 2) return 1;
            if(n == 3) return 2;
            int [] dp = new int [n+1];
            dp[0] = 0;
            dp[1] = 1;
            dp[2] = 2;
            dp[3] = 3;
            for (int i = 4;i <= n; i ++) {
                for (int j = 1; j <= i/2; j ++) {
                    dp[i] = Math.max(dp[i], dp[j] * dp[i-j]);
                }
            }
            return dp[n];
        }
    

    这里还考虑到了对称性,但是要写出前几项,还有一种简短的写法:

    public int integerBreak(int n) {
            int [] dp = new int [n+1];
            dp[1] = 1;
            for (int i = 2;i <= n; i ++) {
                for (int j = 1; j < i; j ++) {
                    dp[i] = Math.max(dp[i], Math.max(j*(i-j), dp[j]*(i-j)));
                }
            }
            return dp[n];
        }
    
    • 贪心

    尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。

    证明:当 n >= 5 时,3(n - 3) - n = 2n - 9 > 0,且 2(n - 2) - n = n - 4 > 0。因此在 n >= 5 的情况下,将绳子剪成一段为 2 或者 3,得到的乘积会更大。又因为 3(n - 3) - 2(n - 2) = n - 5 >= 0,所以剪成一段长度为 3 比长度为 2 得到的乘积更大。

    public int integerBreak(int n) {
        if (n < 2)
            return 0;
        if (n == 2)
            return 1;
        if (n == 3)
            return 2;
        int timesOf3 = n / 3;
        if (n - timesOf3 * 3 == 1)
            timesOf3--;
        int timesOf2 = (n - timesOf3 * 3) / 2;
        return (int) (Math.pow(3, timesOf3)) * (int) (Math.pow(2, timesOf2));
    }
    

    相关文章

      网友评论

          本文标题:刷题笔记

          本文链接:https://www.haomeiwen.com/subject/owugoqtx.html