1. 题目描述

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

代码1:贪心算法(最简单)

思路

  1. /**
  2. * 题目分析:
  3. * 先举几个例子,可以看出规律来。
  4. * 4 : 2*2
  5. * 5 : 2*3
  6. * 6 : 3*3
  7. * 7 : 2*2*3 或者4*3
  8. * 8 : 2*3*3
  9. * 9 : 3*3*3
  10. * 10:2*2*3*3 或者4*3*3
  11. * 11:2*3*3*3
  12. * 12:3*3*3*3
  13. * 13:2*2*3*3*3 或者4*3*3*3
  14. *
  15. * 下面是分析:
  16. * 首先判断k[0]到k[m]可能有哪些数字,实际上只可能是2或者3。
  17. * 当然也可能有4,但是4=2*2,我们就简单些不考虑了。
  18. * 5<2*3,6<3*3,比6更大的数字我们就更不用考虑了,肯定要继续分。
  19. * 其次看2和3的数量,2的数量肯定小于3个,为什么呢?因为2*2*2<3*3,那么题目就简单了。
  20. * 直接用n除以3,根据得到的余数判断是一个2还是两个2还是没有2就行了。
  21. * 由于题目规定m>1,所以2只能是1*1,3只能是2*1,这两个特殊情况直接返回就行了。
  22. *
  23. * 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。
  24. */

让3尽可能多

代码

  1. import java.util.*;
  2. public class Solution {
  3. public static void main(String[] args){
  4. Scanner sc = new Scanner(System.in);
  5. int n = sc.nextInt();
  6. cutRope(n);
  7.  
  8. }
  9. public static int cutRope(int target) {
  10. if(target == 2){
  11. return 1;
  12. }
  13. if(target == 3){
  14. return 2;
  15. }
  16. int num3 = target/3;
  17. int num2 = 0;
  18. switch(target%3){
  19. case 0:break;
  20. case 1:{
  21. num3 = num3-1;
  22. num2 = 2;
  23. break;
  24. }
  25. case 2:{
  26. num2 = 1;
  27. break;
  28. }
  29. }
  30. return (int) (Math.pow(2,num2)*Math.pow(3,num3));
  31. }
  32. }

代码2:动态规划

思路:

  1. //动态规划:长度为i的可得最大乘积:dp[i]=dp[j]*dp[i-j]的最大值
  1. import java.util.*;
  2. public class Solution {
  3. public static void main(String[] args){
  4. Scanner sc = new Scanner(System.in);
  5. int n = sc.nextInt();
  6. cutRope(n);
  7.  
  8. }
  9. //动态规划:长度为i的可得最大乘积:dp[i]=dp[j]*dp[i-j]的最大值
  10. public static int cutRope(int n) {
  11. // n<=3的情况,m>1必须要分段
  12. if(n==2)
  13. return 1;
  14. if(n==3)
  15. return 2;
  16. int[] dp = new int[n+1];//长度为i的时候可得的最大乘积
  17.  
  18. dp[1]=1;
  19. dp[2]=2;
  20. dp[3]=3;
  21. int res=0;//记录最大的
  22. for (int i = 4; i <= n; i++) {//注意4为分界
  23. for (int j = 1; j <=i/2 ; j++) {
  24. //动态规划:长度为i的可得最大乘积:dp[i]=dp[j]*dp[i-j]的最大值
  25. res=Math.max(res,dp[j]*dp[i-j]);
  26. }
  27. dp[i]=res;
  28. }
  29. return dp[n];
  30. }
  31. }

剑指offer:剪绳子(找规律,贪心算法,动态规划)的更多相关文章

  1. 剑指offer 剪绳子

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

  2. python剑指offer剪绳子

    题目 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少 ...

  3. 剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化

    剑指 Offer 60. n个骰子的点数 Offer_60 题目详情 题解分析 package com.walegarrett.offer; /** * @Author WaleGarrett * @ ...

  4. 剑指 Offer 46. 把数字翻译成字符串 + 动态规划

    剑指 Offer 46. 把数字翻译成字符串 Offer_46 题目描述 题解分析 本题的解题思路是使用动态规划,首先得出递推公式如下 dp[i] = dp[i-1]+dp[i-2](如果s[i-1] ...

  5. 剑指offer系列59---寻找丑数

    [题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...

  6. 剑指offer:1.找出数组中重复的数(java版)

    数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...

  7. 《剑指offer》-链表找环入口

    题目描述 一个链表中包含环,请找出该链表的环的入口结点. 初步想法是每个节点做几个标记,表示是否被访问过,那么遍历链表的时候就知道哪个被访问到了.但是不会实现. 另一个直觉是判断链表有环的算法中出现过 ...

  8. 新版剑指offer14 剪绳子

    int maxProduct(int length){ ) ; ) ; ) ; ; == ) numof3 -= ; )/; ,numof3))*(,numof2)); }

  9. 剑指offer第二版-总结:排序算法

    1.排序算法比较: 2.java实现 快排: /** * 快排 * * @since 2019年2月26日 下午1:37:34 * @author xuchao */ public class Qui ...

  10. LeetCode:“剑指 Offer”

    LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...

随机推荐

  1. Codeforces Round #594 (Div. 1) D. Catowice City 图论

    D. Catowice City In the Catowice city next weekend the cat contest will be held. However, the jury m ...

  2. 趣谈Linux操作系统学习笔记:第二十一讲

    一.分段机制 1.分段机制的原理图 2.段选择子 3.段偏移量 例如,我们将上面的虚拟空间分成以下 4 个段,用 0-3 来编号.每个段在段表中有一个项,在物理空间中,段的排列如下图的右边所示. 4. ...

  3. Linux 小工具

    1. 截图工具 shutter 安装 sudo add-apt-repository ppa:shutter/ppa sudo apt-get update sudo apt-get install ...

  4. Feign原理 (图解)

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈 正在进行分布式和高并发基础原理的研习,进行已经发布一些基础性的文章: 一.版本1 :springcloud ...

  5. Saiku嵌入页面plugin=true效果自定义实现(二十七)

    Saiku嵌入页面使用 自定义实现 Plugin=true 效果 saiku嵌入页面plugin=true时数据不显示(plugin=false或者不设定plugin的值时数据显示正常)这个问题困扰了 ...

  6. IT兄弟连 HTML5教程 HTML文件的主体结构

    每个页面都是一个独立的HTML文档,每个HTML文档的主体结构又都是相同的,而且在一个文档中这样的主体结构只能声明一次.可以简单的将HTML文档主体结构分为两部分,一部分是定义文档类型,HTML5中声 ...

  7. pytorch_08_RNN

    1.循环神经网络的提出是基于记忆模型的想法,期望网络能够记住前面出现的特征,并依据特征推断后面的结果,而且整体的网络结构不断循环,因而得名循环神经网络. 2.循环神经网络的基本结构特别简单,就是将网络 ...

  8. OpenGL入门1.7:摄像机

    每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经知道了何为观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点) OpenGL本身没有摄像机(Camera)的概 ...

  9. 尉蓝色的P2P金融众筹平台手机模板

    蓝色的p2p金融投资众筹网手机模板html整站下载.实用的众筹app手机模板下载.主要页面有:众筹项目.发布.个人中心.登录.注册.优惠券.回报.项目详情.我要支持.帮助中心等总共37个手机页面. 模 ...

  10. JS基础语法---循环语句之:for 循环 + 9个练习

    for循环 语法: for(表达式1;表达式2;表达式3){ 循环体; } 执行过程: 先执行一次表达式1,然后判断表达式2;如果不成立则直接跳出循环 如果表达式2成立,执行循环体的代码,结束后,跳到 ...