首页 > 其他分享 >动态规划:剑指 Offer 14- I. 剪绳子

动态规划:剑指 Offer 14- I. 剪绳子

时间:2023-04-14 10:33:38浏览次数:36  
标签:初始化 遍历 乘积 Offer int 绳子 dp 14

题目描述:

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

 

 

提示:

  • 2 <= n <= 58
class Solution {
    public int cuttingRope(int n) {
        /*
        dp五部曲:
        1.状态定义:dp[i]为长度为i的绳子剪成m段最大乘积为dp[i]
        2.状态转移:dp[i]有两种途径可以转移得到
            2.1 由前一个dp[j]*(i-j)得到,即前面剪了>=2段,后面再剪一段,此时的乘积个数>=3个
            2.2 前面单独成一段,后面剩下的单独成一段,乘积为j*(i-j),乘积个数为2
            两种情况中取大的值作为dp[i]的值,同时应该遍历所有j,j∈[1,i-1],取最大值
        3.初始化:初始化dp[1]=1即可
        4.遍历顺序:显然为正序遍历
        5.返回坐标:返回dp[n]
        */
        // 定义dp数组
        int[] dp = new int[n + 1];
        // 初始化
        dp[1] = 1;  // 指长度为1的单独乘积为1
        // 遍历[2,n]的每个状态
        for(int i = 2; i <= n; i++) {
            for(int j = 1; j <= i - 1; j++) {
                // 求出两种转移情况(乘积个数为2和2以上)的最大值
                int tmp = Math.max(dp[j] * (i - j), j * (i - j));
                dp[i] = Math.max(tmp, dp[i]);
            }
        }
        return dp[n];
    }
}

 

 

 

 

动态规划核心思想

动态规划最核心的思想,就在于拆分子问题,记住过往,减少重复计算。

 

 

dp五部曲:
        1.状态定义(确定dp数组及其下标含义):dp[i]为长度为i的绳子剪成m段最大乘积为dp[i]
        2.状态转移(确定递推公式):dp[i]有两种途径可以转移得到
            2.1 由前一个dp[j]*(i-j)得到,即前面剪了>=2段,后面再剪一段,此时的乘积个数>=3个
            2.2 前面单独成一段,后面剩下的单独成一段,乘积为j*(i-j),乘积个数为2
            两种情况中取大的值作为dp[i]的值,同时应该遍历所有j,j∈[1,i-1],取最大值
        3.初始化(dp数组初始化):初始化dp[1]=1即可
        4.遍历顺序:显然为正序遍历
        5.返回坐标:返回dp[n]

 

标签:初始化,遍历,乘积,Offer,int,绳子,dp,14
From: https://www.cnblogs.com/zhz123567/p/17317551.html

相关文章

  • 14面向对象
    面向对象面向对象编程介绍面向对象编程:ObjectOrientedProgramming,简称OOP,是一种程序设计思想。需要注意的是,与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实现的程序,也都能通过面向过程完成。只是看哪种思想更适合当前开发需求。面向过程与面向对象区别面......
  • Linux中使用ntpdate同步失败报错:14 Apr 08:42:12 ntpdate[1255]: the NTP socket is i
    报错信息: 报错原因:1、可能是因为同步的域名信息没有解析到。2、可能是因为服务的问题导致没有同步成功。 解决方法:1、先关闭ntpd服务。[root@k8s-master01~]#servicentpdstopRedirectingto/bin/systemctlstopntpd.service 2、重新同步。[root@k8s-maste......
  • 剑指 Offer 09. 用两个栈实现队列 && leetcode225.用队列实现栈
     剑指Offer09.用两个栈实现队列 classCQueue{private:stack<int>inStack,outStack;voidin2out(){//这里必须是while循环,如果是if判断,则输出栈日常只有一个值,没有起到先入后出的作用while(!inStack.empty()){//将输入栈栈顶......
  • 剑指 Offer 62. 圆圈中最后剩下的数字
    题目链接:剑指Offer62.圆圈中最后剩下的数字方法:约瑟夫环+倒推解题思路假设我们最好剩余的数字是\(N\)。执行完"删除第三个元素"的操作后,\(N\)在新数组中的位置\(P\)的意义是什么?它表示,在新数组中,\(N\)前面有还有\(P\)个元素。那么,在当前数组中,\(N\)前面一定有......
  • 4月14号总结
    packagehhh;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.ArrayList;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebServlet......
  • HDU 5145 NPY and girls (莫队分块离线)
    题目地址:HDU5145莫队真的好神奇。。这样的复杂度居然只有n*sqrt(n)。。。裸的莫队分块,先离线,然后按左端点分块,按块数作为第一关键字排序,然后按r值作为第二关键字进行排序。都是从小到大,可以证明这样的复杂度只有n*sqrt(n)。然后进行块之间的转移。代码如下:#include<ios......
  • HDU 1452 Happy 2004 (积性函数)
    题目地址:HDU1452性质1:如果gcd(a,b)=1则S(a*b)=S(a)*S(b)2004^X=4^X*3^X*167^XS(2004^X)=S(2^(2X))*S(3^X)*S(167^X)性质2:如果p是素数则S(p^X)=1+p+p^2+…+p^X=(p^(X+1)-1)/(p-1)因此:S(2004^X)=(2^(2X+1)-1)*(3^(X+1)-1)/2*(167^(X+1)-1)/166......
  • Educational Codeforces Round 146 (Rated for Div. 2)
    Preface补题ing值得一提的时补这场的时候先是遇上了CF的12小时大维护,后面又遇到了评测机崩了测不了也是有点有意思的说A.Coins傻逼题,首先考虑\(2|n\)时一定有解\(x=\frac{n}{2},y=0\),否则若\(2\nmidn\and2|k\)则由裴蜀定理知此时一定无解否则\(y\)必为奇数,我们令\(x=\fra......
  • 遗传算法 无功优化matlab 利用遗传算法和改进遗传算法对标准节点系统(14 33节点)进行无
    遗传算法无功优化matlab利用遗传算法和改进遗传算法对标准节点系统(1433节点)进行无功优化,以网损+电压偏差罚函数+无功偏差罚函数作为目标函数,利用发电机端电压变压器变比电容器容量作为优化变量,实现很好的优化效果ID:8790635531309941......
  • CF1473D 题解
    题目传送门题目分析线段树、前缀和、\(\text{ST}\)表题解都有了,我补一发猫树题解吧。由于每次操作只能将大小改变成跟原来差\(1\),所以只需要知道这段操作中的最大值和最小值,最后所求的答案的范围就被卡住了。对于每一次操作,我们把操作序列拦腰斩断,那么分别求两边的范围,最后减......