题目描述

给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0] * k[1] * …* k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积为18。

链接

剑指offer P96

思路

1、动态规划
我们定义 f(n) 表示把长度为n的绳子剪成若干段之后各段长度之积的最大值。第一次,我们有n-1个选择可以剪,那么我们可得 f(n) = max(f(i)*f(n-i)),其中 0<i<n 。
从上至下分析:
可得到递推公式,即动态规划转移方程为 f(n) = max(f(i)*f(n-i)),只要我们能够得到所有 f(i) 和 f(n-i) 的最大值,即可得到 f(n) 的最大值。
从下至上求解:
从上至下求解,将会产生大量重复的子问题,我们的求解采取从下至上的求解方式,这样可以保证在求解 f(n) 时,全部的 i < n 的 f(i) 的值已经有最大值,避免重复计算。

具体思路:
当长度为2时,必须切1下,故返回1
当长度为3时,切1下,分为1和2,故返回2
当长度大于3时,对每个切分点进行遍历,取最大值保存,向上动态规划
最终可得结果 f(n)

2、贪心算法
大于4的部分,尽可能多切为3的段
剩余的4,切成2个2,或者不切

代码

#include <bits/stdc++.h>
using namespace std;int DPmaxProduct(int length){if(length < 2){return 0;}if(length == 2){return 1;}if(length == 3){return 2;}int ans[length+1];int max = 0;ans[0] = 0;ans[1] = 1;ans[2] = 2;ans[3] = 3;for(int i = 4; i <= length; i++){max = 0;for(int j = 1; j <= i/2; j++){int temp = ans[j] * ans[i-j];if(max < temp){max = temp;}}ans[i] = max;}return ans[length];
}int GreedymaxProduct(int length){if(length < 2){return 0;}if(length == 2){return 1;}if(length == 3){return 2;}int times3 = length/3;if(length - times3*3 == 1){times3--;}return (int)(pow(3, times3)*(length - times3*3));
}int main()
{int a = 20;cout << DPmaxProduct(a) << endl;cout << GreedymaxProduct(a) << endl;return 0;
}

【剑指offer】剪绳子(动态规划)相关推荐

  1. python剑指offer剪绳子

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

  2. 《剑指offer》c++版本 14.剪绳子

    本题在牛客网剑指offer专项里没看到,原书第二版上有,如题: 这道题是开放的动态规划题,题目中只给了绳子长度,却没定义具体剪多少段,初遇此题,难以下手,看了题解,豁然开朗.设f(n)为常为n的绳子剪 ...

  3. 剑指Offer 14- I. 剪绳子(Medium)/ 剪绳子 II(Medium)/ 343. 整数拆分(Medium)

    剑指Offer 14- II. 剪绳子 II(Medium) 343. 整数拆分(Medium) [题目连接] 题解 剪绳子(数学推导 / 贪心思想,清晰图解) 图解[暴力递归][记忆化技术][动态规 ...

  4. 【LeetCode】剑指 Offer 14. 剪绳子

    [LeetCode]剑指 Offer 14. 剪绳子 文章目录 [LeetCode]剑指 Offer 14. 剪绳子 两道题目的区别在于第二题 n 的取值范围更大 package offer;publ ...

  5. 【LeetCode】【剑指offer】【剪绳子(二)】

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

  6. 剑指 Offer 14- II. 剪绳子 II

    剑指 Offer 14- II. 剪绳子 II 题目描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[ ...

  7. 【算法-剑指 Offer】62. 圆圈中最后剩下的数字(环形链表;约瑟夫环;动态规划)

    剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode) 发布:2021年9月12日12:18:52 问题描述及示例 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每 ...

  8. 剑指 Offer 46. 把数字翻译成字符串(动态规划+回溯+递归 解法)

    剑指 Offer 46. 把数字翻译成字符串 问题描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻 ...

  9. 剑指 Offer 60. n个骰子的点数(动态规划)

    [剑指 Offer 60. n个骰子的点数] 思路: \qquad题目其实不难,写这篇博客主要是记录下C++使用vector开多维数组. \qquad思路类似于走台阶,每次可以走1,2,3阶,问到每一 ...

最新文章

  1. 开发者都想收藏的深度学习脑图,我们抢先曝光了!
  2. 如何在PowerBuilder 11.x 中通过ADO.NET访问Sybase ASE?
  3. 使用PHP CURL的POST数据
  4. Spring注解源码分析
  5. 算法 --- reduce的使用.
  6. imageloader图片基本加载
  7. python iocp_[网络开发]IOCP完整例子
  8. leetcode679:24Game
  9. sql 系统 存储过程的使用方法 转载
  10. 大量用户升级iPhone3.0系统导致苹果服务器故障
  11. 网易云音乐地址解析含官方接口分享
  12. 掌握 3 个搜索技巧,在 GitHub 上快速找到实用软件资源
  13. fastboot实战
  14. 如何将自己网络计算机更名,如何将自己的win7电脑变身wifi无线网络热点
  15. SMAA算法详解 - SMAADetectHorizontalCornerPattern
  16. android水电工具softonic,Softonic
  17. Redis 内存分析神器
  18. node.js的下载安装详细步骤(还有安装配套的express、淘宝镜像、webpack、Vue)
  19. 特征检测与特征匹配算法简介
  20. 清除idea JetbrainsAgent插件

热门文章

  1. org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session
  2. C. Completing the Square
  3. 1196_菊花链通信概念与基础
  4. 天翼电信共享与虚拟机配置
  5. 汉文博士 0.5.5 正式版发布
  6. mybatis判断字符串为空或者空字符串
  7. 计算机_数据库_考研复试_简答题_全(1)
  8. 上海天跃启用润普易度文档管理系统
  9. 清空mailq 队列里面的邮件
  10. Python——pyqt-auto-tool自动化小工具(源码)