package Chap2;/**问题描述* 给你一根长度为n的绳子,把绳子剪成m段(m、n都是整数且m > 1, n > 1),m段绳子的长度依然是整数,求m段绳子的长度乘积最大为多少?* 比如绳子长度为8,我们可以分成2段、3段、4段...8段,只有分成3段且长度分别是2、3、3时能得到最大乘积18*/public class CutString {/*** 动态规划法:* 动态规划求解问题的四个特征: ①求一个问题的最优解; ②整体的问题的最优解是依赖于各个子问题的最优解; ③小问题之间还有相互重叠的更小的子问题; ④从上往下分析问题,从下往上求解问题;* 动态规划:有一段长度为n的绳子,我们现在要剪第一刀,我可以选择下第一刀的地方有1~n-1这些地方;比如长度为10的绳子,我第一刀可以在1~9这些地方下刀,共9种方式。第一刀下去后,绳子分成两部分,假设在i处下刀,绳子两部分就分别为:[0~i]与[i~n],长度分为表示为i与n-i;那么找出第一刀最合适的位置,其实就是找i在哪下刀,可以使得[0~i]与[i~n]的乘积最大,函数表示为:f(n)=max(f(i)×f(n−i))f(n)=max(f(i)×f(n−i))。那么如何判断i处切最大呢?这个时候,我们就要知道,[0~i]这个长度的绳子,任意方式切,最大的乘积是多少;假如说,当我们要切一个长度为10的绳子:切成1和9与4和6,两种方式,哪个乘积更大? 回答:不光要考虑第一刀后两个绳子的大小,还要考虑到9、4、6这三种情况,因为第一刀切出的绳子长度是否可以再切第二刀,使它有更大的乘积,比如将9再切成 3×3×33×3×3,6切成 4×24×2,哪个更大?这种情况下,我们可以发现,无论再怎么切,一定是越切越短,那么我们是否可以将小于给定长度的绳子的每一个长度的最大乘积都求出来? 即:长度为10的绳子,我们就计算出:长度1~9这9种长度的绳子,每种长度的最大乘积是多少。 要求长度9的绳子的最大乘积,我们要知道1~8各个长度的最大乘积,要知道长度8的最大乘积,就要知道1~7长度的各个最大乘积,以此类推。* * 动态规划版本* f(n)定义为将长度为n的绳子分成若干段后的各段长度的最大乘积(最优解),在剪第一刀时有n-1种剪法,可选择在0 < i < n处下刀* 在i处下刀,分成长度为i的左半绳子和长度为n-i的右半绳子,对于这两根绳子,定义最优解为f(i)和f(n-i),于是f(n) = max(f(i) * f(n-i)),即求出各种相乘可能中的最大值就是f(n)的最优解* 就这样从上到下的分下去,但是问题的解决从下到上。即先求出f(2)、f(3)的最优解,然后根据这两个值求出f(4)、f(5)...直到f(n)* f(2) = 1,因为只能分成两半* f(3) = 2,因为分成两段2*1 大于分成三段的1*1*1* ...*/public static int maxProductAfterCutting(int length){//长度小于2 无法分割if(length<2)return 0;//长度等于2 一分为二 1*1if(length==2)return 1;//长度等于3 最大为1*2=2if(length==3)return 2;//定义一个存放>=4 长度的数组 ,对>=4长度的最大的乘积进行临时存储int[] products=new int[length+1];//以下的前三个数组存放的不是最大值,而是长度值products[1]=1;products[2]=2;products[3]=3;for(int i=4;i<=length;i++) {int maxModify=0;for(int j=1;j<=i/2;j++) {int product=products[j]*products[i-j];if(product>maxModify)maxModify=product;}    //得到f(i)的最优解products[i]=maxModify;}    //返回发f(n)return products[length];}/*** 贪婪法,不断分出长度为3的绳子,如果最后只剩下长度为1的绳子,退一步,将得到长度为4的绳子,然后将这长度为4的绳子分成2*2(这样分是因为2*2大于原来的3*1)* 因此n = 4时不能分出长度为3的绳子,而n = 2,n = 3可直接返回* 当n >=5时候,满足n >=5这个不等式的有2*(n-2) > n以及3*(n-3) > n* 注意到2+n-2 = 3+n-3 = n,也就是说分出的两个相乘的数要满足和为n,且同样的n,3*(n-3)的值更大,这就是为什么要不断分出长度为3的绳子的原因*/public static int maxProductAfterCutting2(int length) {// 长度为1时不满足题意,返回0if (length < 2) {return 0;}// f(2)if (length == 2) {return 1;}// f(3)if (length == 3) {return 2;}    //     统计能分出多少段长度为3的绳子int timesOf3 = length / 3;// 如果最有只剩下长度为1的绳子,需要退一步,得到长度为4的绳子,重新分成2*2的if (length - timesOf3 * 3 == 1) {timesOf3--;}// 到这步length - timesOf3 * 3的值只可能是0,2,4,所以timesOf2只可能是0, 1, 2int timesOf2 = (length - timesOf3 * 3) / 2;return (int) Math.pow(3, timesOf3) * (int) Math.pow(2, timesOf2);    }public static void main(String[] args) {System.out.println(maxProductAfterCutting(8));System.out.println(maxProductAfterCutting2(8));}
}

剑指offer_1:给你一根长度为n的绳子,把绳子剪成m段(m、n都是整数且m 1, n 1),m段绳子的长度依然是整数,求m段绳子的长度乘积最大为多少?  * 比如绳子长度为8,我们可以分成相关推荐

  1. Leetcode刷题——剑指offer_1

    Leetcode刷题--剑指offer_1 剑指offer_03 数组中重复的数字 剑指offer_04 二维数组中元素的查找 剑指offer_05 替换空格 剑指offer_06 从尾到头打印链表 ...

  2. 剑指 Offer II 049. 从根节点到叶节点的路径数字之和

    剑指 Offer II 049. 从根节点到叶节点的路径数字之和: 题目链接 :剑指 Offer II 049. 从根节点到叶节点的路径数字之和 题目: 给定一个二叉树的根节点 root ,树中每个节 ...

  3. 剑指offer所有的题目总结(转)

    目录 基本都是参考别的博客和书本的代码,仅作为自己笔记用!! 零.小结: 一.位运算 1.二进制中1的个数 2.判断二进制中0的个数 3.二进制高位连续0的个数 二.二叉树 1.二叉搜索树第k个结点 ...

  4. 剑指Offer题目详解(CPP、JAVA)

    2019.10.11更新 最近开始学习c++,在本文中增加c++的解法,并更新一部分题目的解法. 前言(2018.6.1) 虽然已经度过了艰辛的找实习的日子,到了公司实习.但依然非常怀念那段准备面试. ...

  5. 剑指offer刷题记录(上)

    记录刷题过程,方便自己后期回顾 题目来自<剑指offer>,在牛客上OC,思路大多来自剑指offer,偶尔来自自己的碎碎念,代码自己瞎写的,如果有更优的方法请告诉我,谢谢大佬们 语言:py ...

  6. 剑指Offer-Java刷题个人题解与总结

    刷题 Java刷题技巧 Java输入输出问题 Scanner sc=new Scanner(System.in); 输入一行字符串:sc.nextLine() 输入一个基本类型:sc.nextInt. ...

  7. 剑指offer所有的题目的总结

    目录 基本都是参考别的博客和书本的代码,仅作为自己笔记用!! 零.小结: 一.位运算 1.二进制中1的个数 2.判断二进制中0的个数 3.二进制高位连续0的个数 二.二叉树 1.二叉搜索树第k个结点 ...

  8. 剑指offer所有的题目总结

    自己找工作过程中进行的整理总结. 参考别的博客和书本的代码进行的总结,作为自己笔记用!! 零.小结: 一.位运算 1.二进制中1的个数 2.判断二进制中0的个数 3.二进制高位连续0的个数 二.二叉树 ...

  9. 《牛客网 剑指Offer前20题》

    <剑指Offer> 牛客网 前20道题 前言知识 面试题1:二维数组中的查找 面试题2:二维数组中的查找 面试题3:从头到尾打印链表 面试题4:重建二叉树 ***** 面试题5:两个栈实现 ...

最新文章

  1. 关于ProGuard的学习了解(从别处转来)
  2. Dos判断文件夹有没有存在,如果存在删除,不存在创建
  3. VC2008中处理CStatic控件的单击STN_CLICKED消息
  4. python导入自定义文件_python引入导入自定义模块和外部文件的实例
  5. Linux与Windows共享文件夹之samba的安装与使用 资源管理器直接查看服务器文件
  6. cookies与session
  7. 无需付费,教你IDEA社区版中使用Tomcat
  8. 笨办法学 Python · 续 练习 43:SQL 管理
  9. oraclize预言机资料
  10. 回到顶部效果之加速置顶
  11. AT89S52单片机之定时器/计数器
  12. 现在商业社会,跨界打劫随处可见,一家家政公司跨界疯狂赚钱模式!
  13. javascript 域名合法性检测
  14. PDI-KETTLE-4 使用Kettle完成通用DB数据获取生成指定分隔符的文件并通过FTP上传的功能...
  15. tensorflow代码翻译成pytorch代码 -详细教程+案例
  16. 小甲鱼Python3笔记
  17. 每日C语言代码(The sixth day)——选择排序法
  18. 浅谈软件定义网络SDN
  19. android打开网址两种方法
  20. 才睡醒,写完了好久,就在今天发了吧

热门文章

  1. Mellanox IB卡驱动的安装和小记录
  2. APP怎么在论坛推广?行业论坛渠道要把握!
  3. 线缆种类小结:BNC、RJ45和RJ48
  4. 什么是弱人工智能强人工智能超人工智能
  5. c# 方法参数 传值or传引用?(ref,out,可变参数params,可选参数,命名参数)
  6. BZOJ 1029: [JSOI2007]建筑抢修【贪心】
  7. cmd进入dos命令运行java文件报错找不到无法加载类
  8. idea启动不了,报错Warexploded:Artifact is not deployed. Press ‘Deploy’ to start deployment
  9. 95后能拯救结婚行业吗?《2018美团点评结婚行业蓝皮书》发布
  10. 阿宽食品:“方便食品第一股”争夺战继续