题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述:
输出答案。
示例1
输入
复制
8
输出
复制
18

这是一题典型的动态规划问题,可以写出递推公式如下
f(n)=
1 , n=2
2 , n=3
max{ f(1)*f(n-1),f(2)*f(n-2),…,f(i)f(n-i)},n=其他
代码如下所示,各位记得看注释

public int cutRope(int number){//不在输入限定范围,返回-1if(number<2 || number>60){return -1;}//绳长为2时候,可以分为1,1,返回1if(number==2){return 1;}//绳长为3的时候,可分为1,2,返回3else if(number==3){return 2;}//当绳子长度大于等于4的时候else{//声明数组,array[i]表示长度为i的绳子的乘积的最大值//定义时,为了使得数组的标号和长度信息一致,设定数组的长度为输入的绳子长度+1int[] array=new int[number+1];array[0]=0;//绳子长度为0,没有长度,乘积为0array[1]=1;//绳长为1,乘积为1array[2]=2;//绳长为2,分成1,1,乘积为1array[3]=3;//绳长为3,分成1,3,最大乘积为3int maxNum=0;//当前绳长时取得的最大值for(int i=4;i<=number;i++){//i表示的是输入的绳子长度,由于之前计算过绳长为1,2,3的情况,故这次直接从4开始for(int j=1;j<=i/2;j++){//j表示切开的地方,由于array[5]*array[6]和array[6]*array[5]是一致的,j只需要一种情况就行,故j<=i/2int a=array[j]*array[i-j];if(a>maxNum){maxNum=a;}}array[i]=maxNum;//记录当前绳子长度为i时可以取到的最大乘积}return array[number];//返回要求的最大值}}

可能有人会疑惑(其实就是我自己),为什么在代码中求了每一个array[i]的值而不是直接求array[number],这样做不是耗费性能吗

原因是,如果直接求取array[number],在算法中也会进行拆分,仍然会用到array之前的值,所以必须把array[number]之前的值求出来,才能够求我们要的array[number]
割绳子问题还可以用贪心算法求解,代码如下:

    int cutRope(int number) {if(number==2){return 1;}if(number==3){return 2;}if(number>=4){int x=number%3;int y=number/3;if(x==0){return pow(3,y);}else if(x==1){return 2*2*pow(3,y-1);}else if(x==2){return 2*pow(3,y);}}}

用动态规划和贪心算法求解割绳子问题相关推荐

  1. 53. 最大子序和 golang (动态规划与贪心算法)

    题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续 ...

  2. 活动安排问题的 动态规划和贪心算法

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  3. 从 活动选择问题 看动态规划和贪心算法的区别与联系

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  4. 背包问题贪心算法求解

    题目 有一个背包,背包容量是M=150.有7个物品,物品可以分割成任意大小. 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量. 思路 具有最优子结构性质和贪心选择性质.只要是所有物品的总重量 ...

  5. 分治法、动态规划、贪心算法区别

    联系 分治.动态规划.贪心算法都是把一个大的问题给分解成子问题,通过解决子问题来最终解决原问题的. 区别 分治: 子问题不重复时候更适合,重复也能用,效率低,最好动态规划. 动态规划: 重复的公共子问 ...

  6. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  7. 动态规划与贪心算法比较

    动态规划和贪心算法比较 动态规划: 动态规划一般分为线性动规.区域动规.树形动规.背包动规四类 动态规划程序设计师是对解最优化问题的一种途径.一种方法,而不是一种特殊的算法,并不是一个标准的数学表达式 ...

  8. 算法学习--动态规划与贪心算法

    动态规划与贪心算法都是一种递推算法,都是用局部最优解来推导全局最优解:是对遍历解空间的一种优化:当问题具有最优子结构时,可以用动态规划来解决,而贪心算法是动态规划的特例 动态规划 1. 动态规划的思想 ...

  9. 算法基础课第八章动态规划和贪心算法

    动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程.20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时, ...

最新文章

  1. 图片出处识别_图片模糊怎么变清晰?方法都在这里了
  2. 微软发布屏蔽Win10升级的官方办法
  3. 关于vue内只要html元素的代码
  4. 记一次更改了电脑名称后遇到的各种错误反思及感想
  5. 集群理论详解(续一)
  6. StarLake:汇量科技云原生数据湖的探索和实践
  7. 优酷背后的大数据秘密:资源弹性,可支撑EB级存储
  8. 两个凸多边形的公共面积
  9. 计算机网络原理应用题/计算题
  10. Search in Rotated Sorted Array II leetcode java
  11. 教你如何使用Excel中的INT函数
  12. ACProtect ——脱壳
  13. slack 时钟_【基础知识】时序(Slack、Setup、Hold、Jitter、Skew、亚稳态)
  14. windows修改IP命令/脚本
  15. 美国空运专线 美国空运专线时效多久
  16. 四大文明古国与六大文明
  17. (android文档原创翻译)管理Activity的生命周期一
  18. crm客户管理系统如何助力企业销售管理
  19. 北航2018计算机学院录取名单,【北航2018年拟录取硕士研究生名单公示】- 环球网校...
  20. 什么是分库分表?为什么需要分表?什么时候分库分表

热门文章

  1. 认证机制强化个人信息保护,促进数据合规利用
  2. svg性能低?能展现的点比较少?真的是这样吗?
  3. idea软件 springboot项目启动报错:命令行太长解决
  4. 通过经纬度计算出航向角
  5. H264编码器性能測试
  6. 谈谈盲盒小程序开发的核心功能,以及盲盒小程序未来的市场
  7. javascript中caller和callee区别以及使用场景
  8. ingress-nginx:1.20版本发布项目
  9. IB纪录(十九):At the heard of the image
  10. ZZNUOJ_用C语言编写程序实现1169:单数变复数(指针专题)(附完整源码)