美文网首页
剪绳子动态规划例题(java)

剪绳子动态规划例题(java)

作者: yzuzhangxr | 来源:发表于2020-09-23 18:34 被阅读0次

给你一根长度为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

解题思路:动态规划
对于的绳子的长度 n,当 n ≥ 3 时,可以拆分成至少两个正整数绳长的和。令k是拆分出的第一个正整数,
则剩下的部分是 n-k,n−k 可以不继续拆分,或者继续拆分成至少两个正整数的和。
由于每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积,因此可以使用动态规划求解。
创建数组dp,其中dp[i]表示将正整数i拆分成至少两个正整数的和之后,这些正整数的最大乘积。
特别地,绳子长度不能为0,如果绳子长度为1不能剪,绳子长度为2只能剪成两段,因此,dp[0] = 0, dp[1] = 1, dp[2] = 2
当 i ≥ 2 时,假设对正整数 i 拆分出的第一个正整数是 j(1 ≤ j < i),则有以下两种方案:
将 i 拆分成 j 和 i-j 的和,且 i-j 不再拆分成多个正整数,此时的乘积是 j×(i−j);
将 i 拆分成 j 和 i-j 的和,且 i-j 继续拆分成多个正整数,此时的乘积是 j×dp[i−j]。
因此,当 j 固定时,有 dp[i]=max(j×(i−j),j×dp[i−j])。由于 j 的取值范围是 1 到 i-1,需要遍历所有的 j 得到 dp[i] 的最大值,
因此可以得到状态转移方程如下:dp[i]=max{max(j×(i−j),j×dp[i−j])}
最终得到 dp[n] 的值即为将正整数 n 拆分成至少两个正整数的和之后,这些正整数的最大乘积。


public class CuttingRope {
    public static void main(String[] args) {
        int n = 10;
        System.out.println(cuttingRope(n));
    }

    private static int cuttingRope(int n){
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++){
            int maxResult = 0;
            for (int j = 1; j < i; j++){
                maxResult = Math.max(maxResult,Math.max(j * (i - j),j * dp[i - j]));
            }
            dp[i] = maxResult;
        }
        return dp[n];

    }


}

相关文章

  • 剪绳子动态规划例题(java)

    给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0]...

  • 动态规划 && 贪婪算法

    动态规划 && 贪婪算法 1· 剪绳子(14 剑指offer ) 需要先从 base case 开始寻找规律 ,...

  • 动态规划例题

    动态规划就是把一个复杂的问题分拆为几个小问题,一步步求解。 求最长连续增长子序列。 给出一个数列,输出最长连续增长...

  • 动态规划例题

    最优二分搜索树 二分搜索树 是一棵空树 具有下列性质的二叉树若左子树不空,则左子树上所有结点的值均小于它的根结点的...

  • 2018-06-11

    动态规划法解剪绳子问题 1.问题: 2.分析:定义函数f(n)为长度为n的绳子剪成若干段后的最大长度乘积 若从上而...

  • 动态规划例题总结

    一、01背包问题 题目描述:有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有...

  • 动态规划问题

    动态规划一般思路 动态规划的条件 无后效性 具备最优子结构 经典例题 思考过程 判断是否满足dp解题的条件; 确定...

  • 剪绳子

    题目描述 给定一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0]...

  • 剪绳子

    《剑指offer》面试题14:剪绳子 题目:给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且...

  • 剪绳子

    题目描述:给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0]...

网友评论

      本文标题:剪绳子动态规划例题(java)

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