校招笔试面试前,大家一般都会先去牛客网上刷刷题,《剑指offer》,《leetcode》走起来,然后初次入手,发现很多不会,不会到什么程度呢,连个想法都没有,于是就去讨论区看答案,然后java大神,c++大神会给出花式解答,他们喜欢在答案前加一句,简单的dp算法,递归就可以解决,巴拉巴拉。说的还是很详细的,然而代码并不能看懂,毕竟

人生苦短,我用python

下面就先给大家举一些详细的例子来说说如何解决动态规划问题

首先,你要知道什么才能算动态规划问题,这里,推荐《算法图解》这本书,是基于python写的一本算法讲解书,内容非常简单,没未接触过算法的人也能看懂,我先直接引用这里的讲法:

动态规划就是要将问题细分为小问题,然后再着手解决这些小问题。

例1:(题目来源于牛客网)

题目描述

给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N员(N为0-10000的非负整数)的不同组合的个数。

输入描述:

输入为一个数字N,即需要拼凑的面额

输出描述:

输出也是一个数字,为组成N的组合个数。

这可以视为一个动态回归问题解决,首先我们可以画一个dp表格

dp表的列数字表示要拼成的面额,行表示可以用哪几种面额的拼,比如说dp的一元行,5元列表示只用一元钱拼成5元钱只有一种方法,dp1元,5元行、6元列表示用币值1元和5元拼成6元的方法有两种,明显dp[1,:]=1,而若j>i,dp[i,j]=dp[i-1,j]+dp[i,j-i],例如dp[2,10]=dp[1,10]+dp[2,5], 这个表达式说明,用1元和5元的面额拼成10元的方法数=用1元拼成10元的方法数+用1元和5元拼成5元的方法数,因为面额6-9元拼成方法都是一样的,暂时没有更小的面额可供选择,这个公式便是这个算法的核心

dp表格
  0 1 2 3 4 5 6 7 8 9 10
1元 1 1 1 1 1 1 1 1 1 1 1
1元,5元 1 1 1 1 1 2 2 2 2 2 3
1,元,5元,10元 1 1 1 1 1 2 2 2 2 2 4
1,5,10,20元                      
,1,5,10,20,50元                      
,1,5,10,20,50,100元                      

代码如下

money=[1,5,10,20,50,100]
n = int(input())
li=[]
for i in range(n+1):li.append(0)
li[0]=1
for i in money:for j in range(n+1):if j>=i:li[j]=li[j]+li[j-i]print(li)

例2 来源于《剑指offer》

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)

简单来说就是求一个最大子串问题,也是一个典型的动态规划问题

思路:设F(i)是以array[i]为结束点的最大子向量(从0开始),比如说F(3)就是最后一个向量是7的最大子串,可知

          F(i) = max(F(i-1)+array[i],array[i])

          设res是所有字串中最大的那个,也就是我们最后要求的值

          res  = max(res,F(i))

代码:

def FindGreatestSumOfSubArray(array):f = array[0]res = array[0]for i in range(1,len(array)):f = max(f+array[i],array[i])res = max(res,f)return res

这样便求得最后的解,不懂的话可以自己手写一下循环,多悟几次,日后使用起来就很方便啦

动态规划算法(DP)相关推荐

  1. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  2. 【算法之动态规划(一)】动态规划(DP)详解

    一.基本概念 动态规划(dynamic programming)是 运筹学 的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初 美国 数学家R.E.Be ...

  3. 一文弄懂动态规划(DP Dynamic Programming)下楼梯,国王和金矿,背包问题,Dijkstra算法

    动态规划 参考链接 漫画算法,什么是动态规划? DP 动态规划是一种分阶段求解决策问题的数学思想 题目一 问:下楼梯问题,有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,请 ...

  4. 动态规划算法python_动态规划——DP算法(Dynamic Programing)

    一.斐波那契数列(递归VS动态规划) 1.斐波那契数列--递归实现(python语言)--自顶向下 递归调用是非常耗费内存的,程序虽然简洁可是算法复杂度为O(2^n),当n很大时,程序运行很慢,甚至内 ...

  5. 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1

    之前在刷力扣的时候就是浑浑噩噩的,照着评论区的答案写了一遍就万事大吉了,没有深度思考过.这次备考蓝桥杯看到DP算法的第一道题就不会,更难受的是看答案了依然完全不理解,所以决心把DP算法一次弄懂. 开始 ...

  6. 0x53. 动态规划 - 区间DP(习题详解 × 8)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...

  7. 0x51.动态规划 - 线性DP(习题详解 × 10)

    目录 0x51.动态规划 - 线性DP 0x51.1 LIS问题 Problem A. 登山 (最长下降子序列) Problem B. 友好城市(思维) Problem C. 最大上升子序列和 0x5 ...

  8. 化工热力学补考成功,几天没有头脑了,赶紧赏自己几题Leetcode动态规划算法最长系列

    @Author:Runsen @Date:2020/10/9 "恭喜你昨天,化工热力学补考成功!" "区区化工热力学还想让我重修,只不过浪费了我九月一半的精力和十月的九成 ...

  9. 算法分析与设计-实验二 动态规划算法设计

    文章目录 1. 数字三角问题 2.最长公共子序列问题 3.日常购物 4.台阶问题 一.实验目的: 掌握动态规划算法的基本思想及适用条件,掌握动态规划算法的设计步骤和具体实现. 二.实验所用仪器及环境 ...

  10. 动态规划算法-03背包问题

    背包问题 简介 背包问题一个很著名的动态规划问题,也称为0-1背包问题,很多题都是以此为模板进行魔改的. 问题描述 有N个重量为w1,w2,w3,,,wn且价值为v1,v2,v3,,,vn的物品和一个 ...

最新文章

  1. 聊聊flink的HistoryServer
  2. 动态匹配路由的基本用法||路由组件传递参数
  3. 关于matlab中princomp的使用说明讲解
  4. C++对象确定性解析单例模式
  5. Visual studio代码行数统计
  6. 用DELETE删除的文件怎么免费找回不用购买不用注册码
  7. mysql 的 distinct 去掉重复的数据
  8. spring-mvc笔记1
  9. 客户端本地存储的比较及使用window.name数据传输
  10. 用html编写你好,02 - HTML5第一个项目:HelloWorld!(收藏)
  11. 数据结构与算法python—14.排序之九种排序详解
  12. Thymeleaf模板引擎使用详解
  13. python 对 PDF 的拆分 和合并
  14. 网盘目录搜索系统源码+搭建教程
  15. NL2SQL深度学习方法总结
  16. [C/C++]宽字符与控制台程序
  17. JAVA的直接内存介绍
  18. excel美化技巧-持续更新
  19. gnuplot命令大全
  20. 从赤壁之战看刘备与曹操暴露的最大差距

热门文章

  1. 微信小程序地图实现多个位置标记marker
  2. 怎样把小米手机便签内容转存到百度网盘中去?
  3. 如何将PDF转Word文档
  4. SAXReader解析器
  5. IDEA Jrebel 激活方法
  6. 华硕aura完全卸载_手感细腻,外观出色,配件良心、华硕TUF GAMING K7 光轴机械键盘...
  7. Java基础—封装继承多态(详细)
  8. 电商后台权限设置有哪些规范你知道吗?
  9. 推荐系统实践 - 02利用用户行为数据
  10. 系统分析师学习笔记(八)