题目描述

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

解答:

方法1:

使用动态规划。对于n,可以切为1和n-1,2和n-2.......等等。即递推方程为for(i=1~n-1),dp[n]=max(dp[n-i]*dp[i],dp[n])
但此题有个要求是m>1,即不能不切,这对小于4的数有影响。2只能切一刀,1*1=1。3切一刀1*2=2。4最大2*2=4,5最大2*3=6,即之后的n分割的乘积就大于等于n自己了。
所以对于小于4的n单独返回,其他n动态规划解决。
 class Solution {
public:
int cutRope(int number) {
if(number==){return ;}
if(number==){return ;}
vector<int> dp(number+,INT_MIN);
dp[]=,dp[]=,dp[]=,dp[]=;
for(int i=;i<=number;++i){
for(int j=;j<i;++j){//至少切一刀
dp[i]=max(dp[i-j]*dp[j],dp[i]);
}
cout<<i<<" "<<dp[i]<<endl;
}
return dp[number];
}
};

方法2:

还有一种数学方法,从评论区看到的。是说对于所有的n(n>=4),其最大分割的乘积值都是由2和3乘起来得到的。

来自评论区offer已确定,还差个对象。的思路和代码:

如:

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
 
另外不可能有超过两个2出现在结果中。因为3个2的和为6,6可以分解为两个3,3*3=9,2*2*2=8,9>8,所以不可能分割为3个2。
所以首先我们尽量找更多的3,即n/3个3。如果n%3==1,那么只能少拿一个3,和余的1一起分割成两个2。如7%3==1,那么最大=3*2*2
如果n%3==2,那么直接2*pow(2,n/3)。如8%3==2,最大=2*pow(3,8/3)
 

代码:

 long long n_max_3(long long n) {
if (n == ) {
return ;
}
if (n == ) {
return ;
}
long long x = n % ;
long long y = n / ;
if (x == ) {
return pow(, y);
} else if (x == ) {
return * * (long long) pow(, y - );
} else {
return * (long long) pow(, y);
}
}

剑指offer 面试题. 剪绳子的更多相关文章

  1. 【Python】剑指offer 14:剪绳子

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

  2. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  3. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  4. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  5. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  6. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  7. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  8. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  9. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

随机推荐

  1. AOV拓扑排序实验总结-1

    AOV拓扑排序实验总结-1   实验数据:1.实验输入数据在input.txt文件中2.对于n是指有顶点n个,数据的结束标志是一行0 0.   实验目的:获取优秀的AOV排序算法模板   数据结构安排 ...

  2. AOP配置步骤(XML)

    1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  3. 对Linux内核tty设备的一点理解(转)

    虽然一直做嵌入式Linux,宿主机和开发板通信天天都在用tty设备通信,但是其实自己对TTY设备及终端的概念认识几乎是0.对于Linux内核的终端.tty.控制台等概念的认识很模糊.由于在学习的时候碰 ...

  4. 小白的java学习之路 “ 变量、数据类型和运算符”

    一.变量: 1.什么是变量? 变量是一个数据存储空间的表示 变量由:变量名  变量类型  变量的值 2.创造变量的两种方法: 1.声明-->赋值-->取值 //声明变量 int money ...

  5. JavaScript学习—基本类型—Number

    在JavaScript中,采用IEEE754表示整数和浮点数 整数 十进制 let num10 = 10 八进制 let num8 = 0(1~7) JavaScript中,八进制数值以0作为前导,后 ...

  6. 使用Scanner类

    import java.util.Scanner;   public class HelloWorld {     public static void main(String[] args) {   ...

  7. scrapy框架综合运用 爬取天气预报 + 定时任务

    爬取目标网站: http://www.weather.com.cn/ 具体区域天气地址: http://www.weather.com.cn/weather1d/101280601.shtm(深圳) ...

  8. cin,cin.get(),cin.getline(),gets(),getchar()函数的用法

    1.cin>> 用法a:最基本的流输入用法,接受一个数字或字符,自动跳过输入的空格. 用法b:接受一个字符串,但是遇到除开头外的空格则会终止输入. #include<iostream ...

  9. HW - VCN 介绍

    VCN 是个管理摄像机的平台 用来增删改查摄像机,获取摄像机视频流,获取录像 vcn会基于我们的接口做一次开发,作为相机的统一管理入口,获取相机的信息

  10. H5_0012:js事件冒泡和捕获

    捕获(capture)和冒泡(bubble)是事件传播过程中的两个概念, 比如用户单击某个元素, 但由于元素处于父元素内, 该父元素又处于document对象中, document对象又处于windo ...