如何设计动态规划?

1、问题建模:得到优化的目标函数,约束条件?
2、划分子问题:明确问题的规模在哪里?哪些维度的规模,这样才能才会划分子问题,注意边界。
3、得到递推方程:可以宏观的考虑,也可以借助于微观的归纳演绎。
4、然后检测是否满足最优子结构:检查子问题对其子问题的始、终点也是最优的序列。
5、最小问题的界定,确定初值。

如何编码动态规划?

一般得到了递推方程,就可以写出基于递归的代码实现。
假如子问题大量的重复计算,可借助于递归树分析,就要考虑动态规划。
一般可基于两种方式实现动态规划:一是基于自顶向下的备忘模型,二是基于自底向上演绎模型。

自顶向下的备忘模型:

1、标记哪些子问题结果已经计划出来了没,计算出来了就直接用,
2、特点是代码简单,可以直接基于递归的代码修改,可能比自底向上演绎模型更节省运算,因为没有用到的子问题没有必要计算,
3、缺点是追踪解可能需要专门设计或者不好实现,自顶向下的备忘模型追踪解我还要总结一番。

基于自底向上演绎模型:

1、从小到大的子问题依次计算;
2、前面的计算结果,后面会用到,所以备忘表格初值很重要;
3、类似于数学归纳法,从已知到未知,演绎推理;
4、演绎推理过程,可以标记路径,追踪解比较容易实现;
5、缺点:并不是最大规模以下的所有子问题都需要计算。

偷金子,相邻房间不能偷,如何价值最大?

#%%
# house gold
def house_gold_Rec(gold,n):if n == 0:return gold[0]if n == 1:return gold[gold[0]<gold[1]]first = gold[n]+house_gold_Rec(gold,n-2)second = house_gold_Rec(gold,n-1)return (first,second)[first<second]def house_gold_Top_down_(gold):n = len(gold)list = [-1]*(n)list[0] = gold[0]list[1] = gold[gold[0]<gold[1]]def house_gold_Top_down(gold,n):if list[n] == -1:first = gold[n]+house_gold_Top_down(gold,n-2)second = house_gold_Top_down(gold,n-1)list[n] = (first,second)[first<second]return list[n]return house_gold_Top_down(gold,n-1)def house_gold_Bottom_up(gold):n =len(gold)list= [gold[0],gold[gold[0]<gold[1]]]for i in range(2,n):first = gold[i]+list[i-2]second = list[i-1]list.append((first,second)[first<second])return list[n-1]
#%%    gold = [10,28,5,77,5,10,99,88,67]
#%%
print house_gold_Rec(gold,len(gold)-1)
#%%
print house_gold_Top_down_(gold)
#%%
print house_gold_Bottom_up(gold)

运行结果

gold = [10,28,5,77,5,10,99,88,67]print house_gold_Rec(gold,len(gold)-1)
271print house_gold_Top_down_(gold)
271print house_gold_Bottom_up(gold)
271

换硬币,使换的次数最少?

#%%
#coin change
def coins_change_Rec(money,coins):if money == 0:return 0result = 1000for i in range(len(coins)):if money >= coins[i]:first = coins_change_Rec(money-coins[i],coins)result = (first,result)[first>result]        result += 1return resultdef coins_change_Top_down_(money,coins):list = [-1]*(money+1)list[0] =0def coins_change_Top_down(money,coins):result = 10000for i in range(len(coins)):if money >= coins[i]:if list[money-coins[i]] == -1:list[money-coins[i]] = coins_change_Top_down(money-coins[i],coins)result = (list[money-coins[i]],result)[list[money-coins[i]]>result]list[money] = result + 1return list[money]coins_change_Top_down(money,coins)    print listreturn list[money]def coins_change_bottom_up(money,coins):list = [0,]min_ = min(coins)for x in range(1,min_):list.append(10000)list.append(1)for j in range(min_+1,money+1):result = 10000for i  in range(len(coins)):if j >= coins[i]:result = (list[j-coins[i]],result)[list[j-coins[i]]>result]list.append(result +1)print listreturn list[money]

输出结果

#%%
coins = [13,11,19,23,29,66,46,90]
money = 101
print coins_change_Rec(money,coins)print coins_change_Top_down_(money,coins)
print coins_change_bottom_up(money,coins)
2
2
2

动态规划,从例子到理解相关推荐

  1. 西门子for循环例子_理解JavaScript中的循环缺陷和迭代协议

    如果您已经用JavaScript或任何语言编程了一段时间,for-循环对你来说不应该陌生.您没有注意到许多编程语言,包括JavaScript,已经从使用for-循环使用迭代器-返回给定集合的下一项的对 ...

  2. matlab 背包问题动态规划,从01背包问题理解动态规划---初体验

    这个问题有两种解法,动态规划和贪婪算法.本文仅涉及动态规划. 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大, ...

  3. 【蓝桥杯】最难算法没有之一· 动态规划真的这么好理解?(引入)

    欢迎回到:遇见蓝桥遇见你,不负代码不负卿!  目录 一.何为动态规划DP 二.记忆化搜索 典例1.斐波那契数列 方法一:暴力递归 方法二:记忆化搜索 变形题 典例2:爬楼梯(青蛙跳台阶) 方法一:暴力 ...

  4. 动态规划简单例子——国王与金矿(c++)

    动态规划的要点:确定全局最优解和最优子结构之间的关系,以及问题的边界.以数字的形式表达就是状态转移方程式.下面以一个例子来对他们进行描述. 问题描述: 有一个国家发现了5座金矿,每座金矿的黄金储量不同 ...

  5. 一个简单例子,理解CKKS中rescaling

    CKKS近似同态加密方案作为leveled 同态方案,其中rescaling的步骤至关重要, 按照 Song 的介绍以及他们的文章,rescaling在密文乘运算后进行,一般是重线性化(relinea ...

  6. java 以一个例子来理解面向对象编程思想

    在面向对象的编程中,面向对象的应用是检验你对现实中实际物体和及其关系的抽象能力.在实际编程过程中,你的能力并不是你掌握了多少新的技术,而是对你当前问题的认识的深度,当你理解的足够深的时候,你的框架就出 ...

  7. 【机器学习】贝叶斯分类(通过通俗的例子轻松理解朴素贝叶斯与半朴素贝叶斯)

    贝叶斯分类 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法.这篇文章我尽可能用直白的话语总结一下我们 ...

  8. 对 three.js webgl_clipping_stencil 例子的理解

    three.js 中的官方例子 webgl_clipping_stencil 着实费解,我在不同的时间 看了有三次以上, 才逐渐理解. 概括的讲:这个例子是在说 如何使用webgl stencil 模 ...

  9. msdn 上的关于delegate和event的一个例子,理解后加点评论

    using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Event ...

最新文章

  1. 关闭Mycelipse的拼写检查
  2. 不常见但是有用的 Chrome 调试技巧
  3. python 获取文件名_真实需求 | Python+os+openpyxl 批量获取Excel的文件名和最大行数...
  4. 8月13日见!三星Note 20国行版官宣:唯一悬念只剩价格
  5. doc转docx文件会乱吗_利用python将doc文件转换为docx
  6. weblogic 10 及以后版本需要单独生成Weblogic10.3客户端jar文件
  7. 交通流分析1:《基于大数据的城市公路交通流短时预测研究_张红》阅读总结
  8. Hadoop环境搭建学习之Hive(4)
  9. 苹果ipad怎么刷机_苹果手机:iOS12刷机iOS12正式版刷机教程
  10. 九九乘法表之循环嵌套的奇妙
  11. 键盘按键的各种编码对照表
  12. 数据中台-背景与概念
  13. 镜头焦距、光圈、物距与景深之间的关系
  14. 谈谈开展信息安全工作的四个权力
  15. Java正则表达式实现港、澳、台身份证验证
  16. 关键字深度剖析,集齐所有关键字可召唤神龙?【完】
  17. css3制作手风琴,CSS3制作手风琴——CSS3 :target的应用
  18. “逻辑和”与 “逻辑或”运算符
  19. ASEMI整流桥KBP410参数,KBP410厂家,KBP410货源
  20. 三篇论文,纵览深度学习在表格识别中的最新应用

热门文章

  1. 在MySQL 5.7下排查内存泄露和OOM问题全过程
  2. MySQL设计索引的原则
  3. python中的itertools_在python中使用itertools操作csv数据
  4. python中map函数字典映射_python Chainmap函数(19)
  5. 错误:No plugin found for prefix spring-boot in the current project and in the plugin groups
  6. python包的中 _init _.py文件介绍
  7. 侧边栏跳转_微信和三星首次系统级合作:在负一屏和侧边栏直接打开小程序
  8. 清华计算机学院吴建平,吴建平
  9. MATLAB调试caffe,在MATLAB下调试Caffe
  10. centos7 安装mysql5.6_centos7安装mysql5.6