本期任务:介绍算法中关于动态规划思想的几个经典问题

【算法】【动态规划篇】第1节:0-1背包问题

【算法】【动态规划篇】第2节:数字矩阵问题

【算法】【动态规划篇】第3节:数字三角形问题

【算法】【动态规划篇】第4节:硬币找零问题

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

【算法】【动态规划篇】第6节:最低票价问题

【算法】【动态规划篇】第7节:最长子串问题

【算法】【动态规划篇】第8节:最大正方形问题

【算法】【动态规划篇】第9节:乘积最大子数组问题

【算法】【动态规划篇】第10节:最长连续序列问题


一、问题描述

"""剪绳子问题给你一根长度为N的绳子,请把绳子剪成M段(m,n都是整数),每段绳子的长度记为k[0],k[1],k[2]…. 请问如何剪绳子使得k[0],k[1],k[2]的乘积最大例如 绳子长度8 最大乘积18 = 2*3*3输入:n=8输出:18"""

二、算法思路

本题的解法与硬币找零问题大同小异,可以阅读【算法】【动态规划篇】第4节:硬币找零问题,加深对此类问题的理解。

1. 策略选择

一个模型:

  • 剪绳子问题是典型的“多阶段决策求最优解”问题,每一次决策有最多有n种选择,直到目标值n为0时结束;最优解是各段长度乘积的最大值。

三个特征:

  • 重复子问题:

    • 不同的决策序列,到达某个相同的阶段时,可能会产生重复的状态。
    • 本题中,前两段长度分别为 ( 2 , 2 ) (2,2) (2,2)和 ( 1 , 3 ) (1,3) (1,3)都能进入目标值为4的状态
  • 无后效性:

    • 前面阶段的状态确定之后,不会被后面阶段的决策所改变。一般而言,满足多阶段决策最优解模型的问题都满足无后效性,特例情况,如八皇后问题、解数独问题等。
  • 最优子结构:

    • 后面阶段的状态可以通过前面阶段的状态推导出。
    • 本题中,目标值为8的状态可以由目标值为1-7的状态来推导。

综上所述,本问题满足一个模型、三个特征,所以可以使用动态规划来求解。
当然,凡是能用动态规划解决的问题,都可以用回溯思想来暴力求解,具体实现代码在文末给出,更多关于回溯思想的应用,可以参照:【算法】【回溯篇】第7节:0-1背包问题


三、Python代码实现

1. 动态规划解法

class Solution():def dp(self, n):"""使用动态规划求解剪绳子问题,思路:维护一个长为n的数组,自底向上求解最优值!!!:param n: 绳子长度:return: 最大乘积值"""if n < 2:  # 长度为1,无法剪return 0if n == 2:  # 长度为2,只能剪成1*1return 1if n == 3:  # 长度为3,剪成2*1 > 1*1*1return 2res = [-1] * (n + 1)  # 初始化数组res[0] = 1  # 约定f(0)=1for i in range(1, n + 1):  # 依次计算f(1)--f(8)res[i] = max([(j + 1) * res[i - j - 1] for j in range(i)])return res[-1]def main():n = 8client = Solution()print(client.dp(n))if __name__ == '__main__':main()

运行结果:

18

2. 回溯解法

class Solution():def trackback(self, n):"""使用回溯法求解剪绳子问题:param n: 绳子长度:return: 最大乘积值"""if n < 2:  # 长度为1,无法剪return 0if n == 2:  # 长度为2,只能剪成1*1return 1if n == 3:  # 长度为3,剪成2*1 > 1*1*1return 2self.max_v = n  # n大于0,所以初值设为nself.helper(n, 1)  # 回溯暴力求解return self.max_vdef helper(self, n, v):"""一次遍历完所有可能"""if n == 0:  # 当绳长为0时进行结算if self.max_v < v:self.max_v = vreturnfor i in range(1, n + 1):  # 每次分段的长度介于[1, n]self.helper(n - i, v * i)def main():n = 8client = Solution()print(client.trackback(n))if __name__ == '__main__':main()

运行结果:

18

【算法】【动态规划篇】第5节:剪绳子问题相关推荐

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

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

  2. 【算法】【动态规划篇】第3节:数字三角形问题

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

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

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

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

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

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

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

  6. Java入门算法(动态规划篇2:01背包精讲)

    本专栏已参加蓄力计划,感谢读者支持❤ 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算 ...

  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. 算法复习——动态规划篇之最长公共子序列问题

    算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...

最新文章

  1. C# 用文本框输入的时间段查询SQL数据库
  2. 【Flask】jinja2过滤器的使用
  3. 如何卸载pip 重新安装mysql_pip install cymysql失败的解决办法 | 厘米天空
  4. ubuntu经常提示:检测到系统程序出现问题
  5. 北大暑期课作业 - 对cnblog 和其他技术博客的分析,比较和展望
  6. 6月30日云栖精选夜读:程序员技术与文艺的PK_来首届阿里巴巴研发效能嘉年华...
  7. 22.doublewrite/ChangeBuffer/AHI/FNP
  8. 学习重要,还是学会学习重要
  9. 嵌入式Linux入门:概述
  10. 机器学习实战应用案例100篇(十二)-樽海鞘算法从原理到实战应用案例
  11. Freeradius安装和配置
  12. android win7 共享网络打印机,详解win7共享打印机如何设置
  13. ue4 点击某一物体触发事件_UE4引擎——姜小白修炼记(三)
  14. 英文斜体复制_斜体英文转换器,斜体英文26个字母可复制
  15. 查看linux镜像版本的命令,Linux镜像列表中 怎样决定自己下载哪个版本
  16. 用Matlab实现蒙特卡洛法求心形线面积
  17. 拉丁超立方抽样的Python3实现
  18. 《ROS2机器人建模URDF》8.4控制移动机器人轮子运动
  19. python实训报告pygame_20192423 2019-2020-2 《Python程序设计》实验四报告
  20. 提升成都文化产业竞争力的钻石体系

热门文章

  1. html5 设置视频清晰度,如何将视频变清晰 手机视频不清晰怎么调|如何让视频画质变清晰...
  2. oracle 全面预算,财辅全面预算管理系统的设计与实现(Eclipse,Oracle)
  3. PHM(prognostics and health management健康管理系统)
  4. 使用Arduino的自动宠物喂食器
  5. 网站无无障碍性Accessibility
  6. 深度学习:综述:医疗影像数据+CV数据集
  7. c语言partition头文件,c语言_头文件_windows.h
  8. 锐取电视墙服务器型号,锐取REACH多媒体录播一体机多媒体录播一体机(高清系列)产品中心_DAV数字音视工程网...
  9. 什么是GSP药品经营管理规范?
  10. 【视频】国产电子核混音|Lost In Summer - Release The Soul |混音母带处理 by JeromeAlanChan