本文将会介绍三个用动态规划法解决的例子,分别是:

  • 楼梯台阶问题
  • 二项式系数求解
  • 最大乘积子数组问题

楼梯台阶问题

一个n阶的楼梯,一个婴儿每次爬一阶或两阶,试问一共有多少种办法爬完楼梯。

设f(n)为该问题的解,考虑最后一次的爬法,若最后一次爬一阶,则前面n-1阶楼梯有f(n-1)种办法,若最后一次爬两阶,则前面n-2阶楼梯有f(n-2)种办法,因此:

f(n)=f(n−1)+f(n−2).f(n)=f(n−1)+f(n−2).

f(1)=1,f(2)=2,f(3)=3,….该数列为斐波那契数列,可以参考博客动态规划法(一)从斐波那契数列谈起用动态规划法进行求解。

一个n阶的楼梯,一个婴儿每次爬一阶或两阶或三阶台阶,试问一共有多少种办法爬完楼梯。

同上面的解法一样,有:

f(n)=f(n−1)+f(n−2)+f(n−3).f(n)=f(n−1)+f(n−2)+f(n−3).

其中,f(1)=1,f(2)=2,f(3)=4. 可以参考博客动态规划法(二)找零钱问题用动态规划法进行求解。

二项式系数求解

  对于二项式系数,有如下等式:

Ckn=Ckn−1+Ck−1n−1.Cnk=Cn−1k+Cn−1k−1.

再结合C0n=1,C1n=nCn0=1,Cn1=n对该问题用动态规划法进行求解,本质上这也是一个递归关系式。Python代码如下:

import numpy as npdef binomial(n, k):if k == 0:return 1elif k == 1:return nelse:table = np.array([[0] * (k + 1)] * n, dtype='int64')for i in range(n):table[i, 0] = 1table[i, 1] = i + 1for i in range(n):for j in range(2, k+1):if i+1 < j:table[i, j] = 0else:table[i, j] = table[i-1, j] + table[i-1, j-1]return table[n-1, k]t = binomial(50, 10)
print(t)

最大乘积子数组问题

  所谓的最大乘积子数组问题,指的是:给定一个数组A,寻找A的乘积最大的非空连续子数组。比如,数组 A = [-2, -3, 4], 最大乘积子数组应为A,其乘积为24。
  在博客动态规划法(八)最大子数组问题(maximum subarray problem)中,我们已经用动态规划法解决了最大子数组问题。对于最大乘积子数组问题,我们也可以类似地用动态规划法解决。但是,对于A中元素均为正数的情形,可以有更简单的方法。
  首先对A中元素去对数,则原问题等价于最大子数组问题,找出最大和后,再用指数作用,就能得到A中元素均为正数的最大乘积子数组问题的解。其Python代码如下:

from math import log2, pow# using dynamic programming to slove maximum subarray problem
def DP_maximum_subarray(old_arr):# 对原数组取底为2的对数arr = [log2(x) for x in old_arr]# 对新数组求解最大子数组问题# 并求出该子数组的开始坐标(begin_index)和结束坐标(end_index)t = len(arr)MS = [0]*t # 初始化MS数组MS[0] = arr[0] # 动态规划法的初始值# 动态规划法的子结构for i in range(1, t):MS[i] = max(MS[i-1]+arr[i], arr[i])# 求解该子数组的开始坐标(begin_index)和结束坐标(end_index)end_index = MS.index(max(MS))begin_index = end_indexsum = arr[end_index]while abs(sum- max(MS)) > pow(10, -5):begin_index -= 1sum += arr[begin_index]return begin_index, end_index, pow(2, max(MS))a = [1/2, 4, 1/2, 16, 1/8, 32, 2, 1/16]
begin_index, end_index, max_product = DP_maximum_subarray(a)
print([begin_index, end_index, max_product])

输出结果为:

[1, 6, 256.0]

最大乘积子数组问题的最大乘积为256,子数组开始坐标为1,结束坐标为6,因此子数组为[4, 1/2, 16, 1/8, 32, 2]。

注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

动态规划法(九)想要更多例子? 1相关推荐

  1. 动态规划法(九)想要更多例子?

      本文将会介绍三个用动态规划法解决的例子,分别是: 楼梯台阶问题 二项式系数求解 最大乘积子数组问题 楼梯台阶问题 一个n阶的楼梯,一个婴儿每次爬一阶或两阶,试问一共有多少种办法爬完楼梯. 设f(n ...

  2. 2.12 向量化更多例子-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.11 向量化 回到目录 2.13 向量化 Logistic 回归 向量化更多例子 (More Vectorization Examples) 从上节视频中,你知道了怎样通 ...

  3. 从旁观者到贡献者:经历 OpenYurt 的“开源之夏”,我们想让更多人体验社区的魅力

    作者:OpenYurt 社区 背景 2021 年,中国开源软件推进联盟 COPU 牵头发布了<2021 中国开源发展蓝皮书>,涵盖当今全球开源的总体情况分析.开发者分析.项目分析.领域案例 ...

  4. 吴恩达深度学习 —— 2.12 向量化的更多例子

    当你编写新的网络时,或者做的只是回归,一定要尽量避免for循环,能不用就不用.如果可以使用一个内置函数或者找出其它办法去计算循环,通常会比直接用for循环更快,来看另一个例子. 如果想计算一个向量u, ...

  5. 程序员别再迷茫,赚钱,方法比你想的更多

    每次打开公号,扑面而来一阵阵焦虑: 95后毕业3个月就买房,你的同龄人正在抛弃你 毕业3年,年薪超100万:赚钱,是一种修行 一线城市财务自由门槛2.9亿,看看你还差多少 说来说去就是,牛人跑得好快, ...

  6. LTE-5G学习笔记18--5G关键技术(想学更多快进群)

    一.研究的背景及意义 自2009年5月27日瑞典电信运营商Telia宣布启用世界上第一个4G (LTE: Long Term Evolution)试商用网络以来,4G网络的部署已在全球全面开花.根据G ...

  7. 输入压缩空间量是分区量吗_Windows 10系统想要更多分区怎么办?简单2步教会你磁盘分区!...

    哈喽,大家好 今天我们来聊聊磁盘分区 说到磁盘分区 你会看到别人的笔记本是这样的 而你的笔记本却只有一个C盘可以使用 那么想要拥有更多的分区该怎么操作呢? 今天小微就来给大家详细介绍一下 Window ...

  8. 翌加:抖音账号想要更多关注和粉丝要做好背景图

    不管什么社交软件都需要设置头像,头像代表了个人的喜好.特点.风格等,抖音头像也属于账号的标志,既可以代表个人账号的风格特点,也是品牌宣传的符号.在抖音除了头像,还有背景图也有相似的作用. 背景图是账号 ...

  9. 十九. 想快速开发app,需要找外包吗?

    健生干货分享:第19篇 摘要:最近和两位准备开发app的创业者聊天,他们之前没有移动互联网的相关经验,有的是想法和资金.他们在纠结:想快速开发app,需要找外包吗? 最近和两位想开发app的创业者聊天 ...

最新文章

  1. 概率论与数理统计--第三章
  2. 解析json获取天气信息(中央气象台)
  3. 的table数据重复添加_Mysql的奇技淫巧 - 避免重复插入数据
  4. K个一组翻转链表—leetcode25
  5. vs2015项目导出为Qt项目
  6. 决策树的sklearn实现及其GraphViz可视化
  7. GridView 中如何给删除按钮添加提示
  8. vue使用element案列
  9. 木子-前端-方法标签属性小记(普通jsp/html篇)2020-11-24
  10. 面向对象(冰箱装大象)
  11. 数字标签转化为one-hot形式的tensor
  12. Linux-CentOS安装phpStudy
  13. root过的安卓机器,安卓机怎样root
  14. 使用vlc串流http视频链接
  15. saveOrUpdate
  16. B2C销售网站的设计与实现
  17. 词向量学习笔记(一)Word2vec
  18. bullmind在线思维导图软件
  19. JVM内存模型和性能调优:系列文章 - 导读
  20. 马克思手稿中的趣味数学题

热门文章

  1. Python爬虫 --- 2.2 Scrapy 选择器的介绍
  2. Laravel学习笔记四-数据库迁移和模型文件
  3. html5 图片热点area,map的用法
  4. JSP include directive 和JSP include的区别
  5. 类似华容道一类搜索中,状态的Hash方法(转)
  6. fedora学习笔记 6:浅谈linux文件系统
  7. python函数类_python函数、类
  8. amcharts去除版权标志
  9. Android界面开发工具DroidDraw
  10. 几米的一段话,献给所有小郁闷的人