题目:

把长度为n的绳子剪成m段(n>1,m>1),每段绳子的长度记为k[1],...k[m],则每段绳子的长度的最大乘积是多少?例如身子长度为8时,剪成2,3,3三段得到的乘积最大,为18。

思路:

方法1:动态规划的思想

假设长度为n的绳子被剪成若干段后,各段长度的最大乘积为f(n)。一刀下去可能的位置有1,2,...,n-1,j将绳子分为长度为i和n-i的两段,则f(n)=max{f(i)*f(n-i)},i=1,2,...,n-1。从上往下递归时可能会有很多重复的计算,因此采用从下往上的方式,先计算f(2),f(3),后面的就可以依次计算了。n=2时,只有一种剪法,f(2)=1*1=1,n=3时,只有剪成1,2,f(3)=1*2=2*1=2。

写代码要注意:n=2时,因为必须要剪一刀,只能剪成1和1,所以最大乘积是1,但是初始化f(2)的时候,是为了计算n>3的情况,因此如果有长度为2的肯定至少剪了一刀,这时候长度为2的最大乘积是2,初始化f(3)也是同理。

方法2:贪婪算法的思想

如果按照如下策略来剪绳子,则得到各段绳子的长度的乘积将最大。当n>=5时,尽可能多剪长度为3的绳子,当剩下绳子长度为4时,剪成2*2的两段。

写代码要注意:整除3后余数只有0,1,2三种情况,如果是2,那应该直接2*3^(timeOf3);如果是1,说明多剪了一个3,应该应该拿出来一个3(timeOf3-1)和剩下的1组成4,结果是4*3(timeOf3);如果是0,说明正好每段为3剪完,结果是1*3^(timeOf3)。

方法1代码:

int maxProduct(int n)
{if(n<=1)return 0;int *dp=new int[n+1];if(n==2)return 1;if(n==3)return 2;//注意这里的初始化dp[0]=0;dp[1]=1;dp[2]=2;dp[3]=3;for(int i=4;i<=n;i++){int maxP=0;for(int j=1;j<=i/2;j++){int product=dp[j]*dp[i-j];if(product>maxP)maxP=product;}dp[i]=maxP;}int result=dp[n];delete[] dp;return result;
}

方法2代码:

int maxProduct(int n)
{if(n<=1)return 0;if(n==2)return 1;if(n==3)return 2;if(n==4)return 4;int timeOf3=n/3;int result=n-timeOf3*3;//余数//注意不同余数情况下的处理if(result==0)result=1;if(n-timeOf3*3==1){timeOf3-=1;result=4;}for(int i=1;i<=timeOf3;i++){result=result*3;}return result;
}

剪绳子(动态规划和贪婪算法)相关推荐

  1. 剑指Offer:剪绳子(动态规划、贪婪算法)

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

  2. 88. Leetcode 剑指 Offer 14- I. 剪绳子 (动态规划-基础题)

    给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] .请问 k[0]*k[1]*... ...

  3. 动态规划贪婪算法之剪绳子

        动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决. 1. 可以使用动态规划的情形: (1)在应用动态规划之前,要分析能否把大问题分解成小问 ...

  4. 剪绳子 算法_[校招-算法题]动态规划

    动态规划(Dynamic Programming)是面试中非常常见的一种算法,可以解决很多复杂问题. 核心算法: 定义状态:dp[i],一个数组,具体几维根据问题定. 状态转移方程:dp[i] = b ...

  5. 动态规划-剪绳子问题

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

  6. 12、剪绳子——剑指offer——动态规划

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

  7. 【LeetCode笔记】剑指 Offer 14. 剪绳子 I II(Java、动态规划、偏数学)

    文章目录 剪绳子 I 题目描述 思路 && 代码 1. 动态规划 O(n2n^2n2).O(n) 2. 最优解:数学方法 O(n).O(1) 二刷 剪绳子 II 题目描述 思路 &am ...

  8. 剑指 Offer 14.剪绳子(动态规划、数学分析)

    一.题目内容 二.题目分析 这道题目讲道理,我看到的第一眼就是动态规划,但是后来提交之后,发现还有大佬考虑用数学分析得出精简解法,在这里我也会一 一阐述. 对于动态规划而言,按照老套路,首先定义dp数 ...

  9. 【算法】【动态规划篇】第5节:剪绳子问题

    本期任务:介绍算法中关于动态规划思想的几个经典问题 [算法][动态规划篇]第1节:0-1背包问题 [算法][动态规划篇]第2节:数字矩阵问题 [算法][动态规划篇]第3节:数字三角形问题 [算法][动 ...

最新文章

  1. Ubuntu使用远程桌面
  2. 微信公众平台开发接口PHP SDK完整版
  3. python cookie使用_Python使用cookielib模块操作cookie的实例教程
  4. 【Java】命令行生成JavaDoc文档
  5. python背包问题递归_想问下大神python的背包问题的源代码(最好玩也有伪代码,请用递归法实现),因为只学过递归法,所...
  6. [转]冰山一角 管窥中国互联网的地下世界
  7. 计算机统计硕士排名,卡内基梅隆大学硕士统计学专业排名务必稳重的去看
  8. 【金融市场基础知识】——中国的金融体系(二)
  9. jd页面与tianmao页面模仿jsonp跨域
  10. 坐标正反算例题_坐标正算公式例题
  11. qq说说时间轴php实现,qq空间时间轴 PHP实现时间轴函数代码
  12. 美国贷款买饭的房屋保险
  13. Weekly Recap!相对不平淡的行情 相对冷淡的 DeFi 市场
  14. 在ROS中创建并优化机器人URDF模型
  15. ElasticSearch 参数调优
  16. 财务数据中台架构及建设方案(ppt)
  17. 解决Ubuntu16.04卡在开机画面
  18. 在python中numpy是什么意思_numpy是什么
  19. 人工智能6-GA遗传算法
  20. Wannafly 22A

热门文章

  1. properties文件及ResourceBundle读取properties文件分析
  2. 普通手机安装谷歌商店上的app
  3. 线程池面试题一般会怎么问?线程池面试题总结及答案整理
  4. 1分钟了解 IIFE
  5. Review of Algorithm (HITSZ) 含22年真题回忆
  6. 三星I9100有时不能收发彩信完美解决!中国移动
  7. Java中计算范围时间内有几周并返回每周起止日期
  8. 【系统设计】:画UML时序图的技巧
  9. matlab数值拟合r2_MATLAB之数据处理+公式拟合
  10. 分治法——Hanoi塔