剑指offer:剪绳子(找规律,贪心算法,动态规划)
1. 题目描述
- /*
- 题目描述
- 给你一根长度为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。
- 输入描述:
- 输入一个数n,意义见题面。(2 <= n <= 60)
- 示例1
- 输入 8
- 输出 18
- */
代码1:贪心算法(最简单)
思路
- /**
- * 题目分析:
- * 先举几个例子,可以看出规律来。
- * 4 : 2*2
- * 5 : 2*3
- * 6 : 3*3
- * 7 : 2*2*3 或者4*3
- * 8 : 2*3*3
- * 9 : 3*3*3
- * 10:2*2*3*3 或者4*3*3
- * 11:2*3*3*3
- * 12:3*3*3*3
- * 13:2*2*3*3*3 或者4*3*3*3
- *
- * 下面是分析:
- * 首先判断k[0]到k[m]可能有哪些数字,实际上只可能是2或者3。
- * 当然也可能有4,但是4=2*2,我们就简单些不考虑了。
- * 5<2*3,6<3*3,比6更大的数字我们就更不用考虑了,肯定要继续分。
- * 其次看2和3的数量,2的数量肯定小于3个,为什么呢?因为2*2*2<3*3,那么题目就简单了。
- * 直接用n除以3,根据得到的余数判断是一个2还是两个2还是没有2就行了。
- * 由于题目规定m>1,所以2只能是1*1,3只能是2*1,这两个特殊情况直接返回就行了。
- *
- * 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。
- */
让3尽可能多
代码
- import java.util.*;
- public class Solution {
- public static void main(String[] args){
- Scanner sc = new Scanner(System.in);
- int n = sc.nextInt();
- cutRope(n);
- }
- public static int cutRope(int target) {
- if(target == 2){
- return 1;
- }
- if(target == 3){
- return 2;
- }
- int num3 = target/3;
- int num2 = 0;
- switch(target%3){
- case 0:break;
- case 1:{
- num3 = num3-1;
- num2 = 2;
- break;
- }
- case 2:{
- num2 = 1;
- break;
- }
- }
- return (int) (Math.pow(2,num2)*Math.pow(3,num3));
- }
- }
代码2:动态规划
思路:
- //动态规划:长度为i的可得最大乘积:dp[i]=dp[j]*dp[i-j]的最大值
- import java.util.*;
- public class Solution {
- public static void main(String[] args){
- Scanner sc = new Scanner(System.in);
- int n = sc.nextInt();
- cutRope(n);
- }
- //动态规划:长度为i的可得最大乘积:dp[i]=dp[j]*dp[i-j]的最大值
- public static int cutRope(int n) {
- // n<=3的情况,m>1必须要分段
- if(n==2)
- return 1;
- if(n==3)
- return 2;
- int[] dp = new int[n+1];//长度为i的时候可得的最大乘积
- dp[1]=1;
- dp[2]=2;
- dp[3]=3;
- int res=0;//记录最大的
- for (int i = 4; i <= n; i++) {//注意4为分界
- for (int j = 1; j <=i/2 ; j++) {
- //动态规划:长度为i的可得最大乘积:dp[i]=dp[j]*dp[i-j]的最大值
- res=Math.max(res,dp[j]*dp[i-j]);
- }
- dp[i]=res;
- }
- return dp[n];
- }
- }
剑指offer:剪绳子(找规律,贪心算法,动态规划)的更多相关文章
- 剑指offer 剪绳子
题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]xk[1]x...xk[m]可能 ...
- python剑指offer剪绳子
题目 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少 ...
- 剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化
剑指 Offer 60. n个骰子的点数 Offer_60 题目详情 题解分析 package com.walegarrett.offer; /** * @Author WaleGarrett * @ ...
- 剑指 Offer 46. 把数字翻译成字符串 + 动态规划
剑指 Offer 46. 把数字翻译成字符串 Offer_46 题目描述 题解分析 本题的解题思路是使用动态规划,首先得出递推公式如下 dp[i] = dp[i-1]+dp[i-2](如果s[i-1] ...
- 剑指offer系列59---寻找丑数
[题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...
- 剑指offer:1.找出数组中重复的数(java版)
数组中重复的数:题目:找出数组中重复的数,题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任 ...
- 《剑指offer》-链表找环入口
题目描述 一个链表中包含环,请找出该链表的环的入口结点. 初步想法是每个节点做几个标记,表示是否被访问过,那么遍历链表的时候就知道哪个被访问到了.但是不会实现. 另一个直觉是判断链表有环的算法中出现过 ...
- 新版剑指offer14 剪绳子
int maxProduct(int length){ ) ; ) ; ) ; ; == ) numof3 -= ; )/; ,numof3))*(,numof2)); }
- 剑指offer第二版-总结:排序算法
1.排序算法比较: 2.java实现 快排: /** * 快排 * * @since 2019年2月26日 下午1:37:34 * @author xuchao */ public class Qui ...
- LeetCode:“剑指 Offer”
LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...
随机推荐
- 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 ...
- 趣谈Linux操作系统学习笔记:第二十一讲
一.分段机制 1.分段机制的原理图 2.段选择子 3.段偏移量 例如,我们将上面的虚拟空间分成以下 4 个段,用 0-3 来编号.每个段在段表中有一个项,在物理空间中,段的排列如下图的右边所示. 4. ...
- Linux 小工具
1. 截图工具 shutter 安装 sudo add-apt-repository ppa:shutter/ppa sudo apt-get update sudo apt-get install ...
- Feign原理 (图解)
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈 正在进行分布式和高并发基础原理的研习,进行已经发布一些基础性的文章: 一.版本1 :springcloud ...
- Saiku嵌入页面plugin=true效果自定义实现(二十七)
Saiku嵌入页面使用 自定义实现 Plugin=true 效果 saiku嵌入页面plugin=true时数据不显示(plugin=false或者不设定plugin的值时数据显示正常)这个问题困扰了 ...
- IT兄弟连 HTML5教程 HTML文件的主体结构
每个页面都是一个独立的HTML文档,每个HTML文档的主体结构又都是相同的,而且在一个文档中这样的主体结构只能声明一次.可以简单的将HTML文档主体结构分为两部分,一部分是定义文档类型,HTML5中声 ...
- pytorch_08_RNN
1.循环神经网络的提出是基于记忆模型的想法,期望网络能够记住前面出现的特征,并依据特征推断后面的结果,而且整体的网络结构不断循环,因而得名循环神经网络. 2.循环神经网络的基本结构特别简单,就是将网络 ...
- OpenGL入门1.7:摄像机
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 我们已经知道了何为观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点) OpenGL本身没有摄像机(Camera)的概 ...
- 尉蓝色的P2P金融众筹平台手机模板
蓝色的p2p金融投资众筹网手机模板html整站下载.实用的众筹app手机模板下载.主要页面有:众筹项目.发布.个人中心.登录.注册.优惠券.回报.项目详情.我要支持.帮助中心等总共37个手机页面. 模 ...
- JS基础语法---循环语句之:for 循环 + 9个练习
for循环 语法: for(表达式1;表达式2;表达式3){ 循环体; } 执行过程: 先执行一次表达式1,然后判断表达式2;如果不成立则直接跳出循环 如果表达式2成立,执行循环体的代码,结束后,跳到 ...