题目描述

给你一根长度为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. 简单的leetcode题

    简单的leetcode题 环绕字符串中唯一的子字符串 把字符串 s 看作是\("abcdefghijklmnopqrstuvwxyz"\)的无限环绕字符串,所以 s 看起来是这样的 ...

  2. axios 跨域请求允许带cookie,则服务器Access-Control-Allow-Origin应设置为具体域名,否则请求无法获得返回数据

    1.通过允许跨域访问实现了跨域请求,但为了使每个请求带上session信息,我设置了withCredentials ,即: axios.defaults.withCredentials = true ...

  3. 1级搭建类111-Oracle 19c SI FS(Windows Server 2019)公开

    Oracle 19c 单实例文件系统在Windows Server 2019上的安装 在线查看

  4. 1级搭建类107-Oracle 18c 单实例 FS(华为云)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  5. Codeforces 1304E. 1-Trees and Queries 代码(LCA 树上两点距离判奇偶)

    https://codeforces.com/contest/1304/problem/E #include<bits/stdc++.h> using namespace std; typ ...

  6. DFS-B - Dr. Evil Underscores

    B - Dr. Evil Underscores Today, as a friendship gift, Bakry gave Badawy nn integers a1,a2,…,ana1,a2, ...

  7. 2019.2.21 T2题解

    meet 大概思路就是 , 找出相交的路径 , 判断方向 , 分类讨论.. 假设已经找出了相交路径 ... 若方向相同 , 则找到相交路径上边权的最大值 , 若最大值>出发时间差 , 则可行. ...

  8. css权重及计算

    一.一般而言:!important--->行间样式--->id--->class | 属性--->标签选择器--->通配符 二.权重值 !important        ...

  9. react-React深入-一等公民-props-onChange

    title: '[react]深入 - 一等公民 props & onChange' date: 2017-08-23 10:05:07 tags: react reactjs props o ...

  10. JQ input输入框回车生成标签,可删除,并获取标签的值

    在网上找的,效果如下 html代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <title&g ...