步骤

(1)确定初始状态

(2)确定转移矩阵,得到每个阶段的状态,由上一阶段推到出来

(3)确定边界条件。

例题

  1. 蓝桥杯——印章(python实现)

使用dp记录状态,dp[i][j]表示买i张印章,凑齐j种印章的概率

i表示买的印章数,j表示凑齐的印章种数

情况一:如果i<j,不可能凑齐印章,概率为0

情况二:如果j=1,dp[i][1] = n*((1/n)**i),凑齐一种印章,所有i个印章为一个种类,这一个种类有n种情况可选

情况三:凑齐j种印章。前面买了i-1个印章。可能前面i-1步凑够了j种印章,那么只用从j种里随意选出来一个dp[i-1][j]*j*p;可能前面i-1步凑够了j-1种印章,那么从剩下的n-j+1种里选出来一个dp[i-1][j-1]*(n-j+1)*p,因此为dp[i][j] = dp[i-1][j]*j*p+dp[i-1][j-1]*(n-j+1)*p

strs = input().strip().split()
n = int(strs[0])
m = int(strs[1])# 使用dp记录状态,dp[i][j]表示买i张印章,凑齐j种印章的概率
dp = [[0]*(n+1) for _ in range(m+1)]p = 1.0/nfor i in range(1,m+1):for j in range(1,n+1):# 如果i<j,不可能凑齐印章if i<j:dp[i][j] = 0# 如果凑齐一种印章elif j==1:dp[i][1] = n*(p**i)# 凑齐j种印章:可能前面i-1步凑够了j种印章,那么只用从j种里随意选出来一个;# 可能前面i-1步凑够了j-1种印章,那么从剩下的n-j+1种里选出来一个else:dp[i][j] = dp[i-1][j]*j*p+dp[i-1][j-1]*(n-j+1)*p
print('%.4f'%(dp[m][n]))
  1. 蓝桥杯——算法训练 拿金币

使用dp记录状态,dp[i][j]表示在arr[i][j]可以拿到的最多金币数。

情况一:如果i=j=0,那么此位置最多拿到金币数dp[0][0]=arr[0][0]

情况二:如果i=0,那么无法从上方转移,只能从左边转移到arr[0][j]。dp[0][j] = dp[0][j - 1] + arr[0][j]左边位置的最大金币数加上当前位置arr[0][j]的金币数

情况三:如果j=0,那么无法从左方转移,只能从上边转移到arr[i][0]。dp[i][0] = dp[i - 1][0] + arr[i][0]上边位置的最大金币数加上当前位置arr[i][0]的金币数

情况四:如果i,j != 0,dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + arr[i][j],当前位置金币数arr[i][j]加上左边和上边dp中最大的一个 max(dp[i - 1][j], dp[i][j - 1])

n = int(input())
strs = [(input()).strip().split() for _ in range(n)]
arr = []
for i in range(n):temp = []j = 0while j < len(strs[i]):temp.append(int(strs[i][j]))j += 1arr.append(temp)dp = [[0] * n for _ in range(n)]
for i in range(n):for j in range(n):if i == 0 and j == 0:dp[0][0] = arr[0][0]if i == 0:dp[0][j] = dp[0][j - 1] + arr[0][j]if j == 0:dp[i][0] = dp[i - 1][0] + arr[i][0]if i != 0 and j != 0:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + arr[i][j]print(max(max(dp)))

DP算法:动态规划算法相关推荐

  1. 漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)

    在前两集漫画中,我们通过一个算法问题的完整解题过程,讲述了动态规划的基本概念和思想.没看过前两集的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 漫画说算法–动态规划算法 ...

  2. 五大常用算法——动态规划算法详解及经典例题

    一.基本概念 动态规划是运筹学中用于求解决策过程中的最优化数学方法.当然,我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法. 动态规划过程是:每次决策依赖于当前状态,又 ...

  3. 算法-动态规划算法总结

    1 基础问题 // 509. 斐波那契数 // 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.// dp[i]的 ...

  4. 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...

  5. 算法-动态规划算法(详解)

    动态规划算法介绍 1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法 2)动态规划算法与分治算法类似,其基本思想也是将 ...

  6. 漫画说算法--动态规划算法二(绝对通俗易懂,非常棒)

    在上一篇漫画中,我们分析了一道动态规划相关的算法问题,并归纳出了问题的状态转移方程式.没看过上一篇的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 首先,让我们简单回顾一 ...

  7. 算法——动态规划算法

    动态规划法基本思想:将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解. 著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等. 个人对动态规划的理解,主要就是避免 ...

  8. 算法——动态规划算法求解字符串的编辑距离

    当有人让你用递归算法求解斐波那契数列以及字符串的编辑距离时,所设的陷阱都是一致的(递归调用时的重复计算),解决方案也是一致的(引入备忘录概念).观察树形的层级调用关系,我们可以发现动态规划隐式地嵌入了 ...

  9. 贪心、递归、递推以及动态规划算法的分析与对比

    PS:   头一次规规矩矩的按照论文的格式写文章,呵呵.虽然是小儿科的不能再小儿科的东西了..不过..也忽悠了6000多字~~嘿嘿..肯定写的不好,第一次嘛..所以..接受大家一切批评哈!...文章N ...

  10. 以空间换时间——动态规划算法及其应用:矩阵链相乘

    动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...

最新文章

  1. 一对一培训之视频免费分享-2018-01-21-第 03 阶段-准备-基础-架构-01
  2. 精通python设计模式-Python设计模式
  3. 清除window 系统中的垃圾文件-转
  4. 记录 之 不同的Normalization方式
  5. JavaScriptSerializer序列化与反序列化--备忘
  6. 欧奈尔4个经典形态_股票K线图基础知识:图解4大经典K线组合形态
  7. Java 多线程,线程池,
  8. Java IO源码目录
  9. xampp安装教程及使用
  10. 博客程序PHP,10个开源的PHP blog 博客程序推荐
  11. 浙江计算机二级word试题,浙江省计算机二级高级办公软件word试题
  12. 华为P7开启USB调试方法
  13. 谷歌(chrome)恐龙小游戏外挂
  14. 分类与预测模型效果评价
  15. cocos creator pc web端 全屏
  16. 【火炉炼AI】深度学习001-神经网络的基本单元-感知器
  17. java面试所问到的问题和资料整理
  18. 初探自动化测试(爬虫)框架nightmarenightwatch
  19. PhpStorm中实现代码自动换行
  20. Mencoder安装编译手册

热门文章

  1. google android 系统介绍
  2. AndroidStudio问题XML格式化
  3. 网站选择关键词需要遵循哪些原则呢?
  4. 25-36.产品经理入门到精通(三)
  5. HttpClient 连接超时重试处理
  6. unpacked value/target cannot be used in assignment
  7. apple id是什么意思
  8. SitePoint播客#94:新年快乐!
  9. 微软PPM 软件 android,微软Surface Duo带来改进后的手写笔支持 Android系统也可顺滑无迟滞...
  10. NLP聊天机器人的搭建(chatbot)(一)