1、爬楼梯问题
一个人爬楼梯,每次只能爬1个或两个台阶,假设有n个台阶,那么这个人有多少种不同的爬楼梯方法

动态规划的状态转移:第 i 个状态的方案数和第 i-1, i-2时候的状态有关,即:dp[i]=dp[i-1]+dp[i-2],dp表示状态矩阵。

ps:最多爬两阶,到达第n阶台阶的只有两种方式,从n-1阶上来或从n-2阶上来,变形的斐波那契数列

def stealJewellery(value):
    n=len(value)
    dp=[0]*n
    dp[0]=value[0]
    dp[1]=value[0]
    for i in range(2,n):
        dp[i]=max(dp[i-2]+value[i],dp[i-1])
    return dp[n-1]

2、取珠宝问题
一条直线上,有n 个房间,每个房间数量不等的财宝,一个盗贼希望从房屋中盗取财宝,由于房屋有警报器,
同时从相邻两个房间盗取珠宝就会触发警报,求在不触发警报的情况下,最多可获取多少财宝?

可以发现,前i个房间最大可获取的数量和前i-1,i-2个房间可获取的最大珠宝数量,以及第i个房间的珠宝数量有关:
第i个房间珠宝有两种方案,获取(总最大数量等于第i个房间的珠宝数量+前i-2个房间的珠宝最大数量)
和不获取(总最大数量=前i-1个房间可获取珠宝的最大数量)即 dp[i]=max(dp[i-2]+value[i],dp[i-1])

def stealJewellery(value):
    n=len(value)
    dp=[0]*n
    dp[0]=value[0]
    dp[1]=max(value[0],value[1]) #if n>1
    for i in range(2,n):
        dp[i]=max(dp[i-2]+value[i],dp[i-1])
    return dp[n-1]

3、最大子序列和问题
给定一个数组,求这个数组的连续子数组中,最大的那一段的和。
如数组 arr= [-2,1,-3,4,-1,2,1,-5,4]
状态转移:
如果当前数组的值arr[i]加上第i-1个状态的值大于数组arr[i],第i个状态的值就等于arr[i]+dp[i-1],
否则,dp[i]=arr[i]。其中dp[i]记录的是以第i个数组结尾的最大字段和
记录当前最大的子序列和。即 dp[i]=max(dp[i-1]+arr[i],arr[i]),最大子序列和为max(dp)

ps:注意·dp[i]是使用arr[i]结尾的连续数组的最大和,不是当前arr[0:i]的最大子序列和。比如dp[0]=-2,dp[1]=1,dp[2]=-2

 dp[2]计算的是包含-3在内的最大子序列和(1+(-3)=-2>(-3)>(-2)+1+(-3)),所以最后要求一个ma'x

def subsequenceSum(arr):
    n=len(arr)
    dp=[0]*n
    dp[0] = arr[0]
    for i in range(1,n):
        dp[i]=max(dp[i-1]+arr[i],arr[i])
    return max(dp)

4、找零钱问题
已知不同面值的钞票,求如何用最少数量的钞票组成某个金额,求可以使用的最少钞票数量。如果任意数量的已知面值钞票都无法组成该金额,则返回-1

假设coins=[1,2,5,7,10],金额:amount=14,dp[i]表示金额 i 的最优解
金额14的最后一张面额可能由coins里面的任意一张得到,即:
14=coins[0]+(14-coins[0]) 14=1+13  dp[14]=1+dp[13]
14=coins[1]+(14-coins[1]) 14=2+12  dp[14]=1+dp[12]
14=coins[2]+(14-coins[2]) 14=5+9  dp[14]=1+dp[9]
14=coins[3]+(14-coins[3]) 14=7+7  dp[14]=1+dp[7]
14=coins[4]+(14-coins[4]) 14=10+4  dp[14]=1+dp[4]

具体最后一张选了哪个面额,就要看哪个面额情况下总拼凑数量最少。即:dp[i]=min(dp[i],dp[i-coins[j]]+1),
当计算到金额14时候,小于14的金额的最小数量都已经求出并存储在dp[i]里面,此时只需要直接取出比较即可。最终函数返回dp[14]即为所求的最少数量。

求解代码一共有两个for循环,一个是金额从0-amount的最少数量(dp[i]),另外一个是面额数量组合(coins[j])。
dp[i]的初始值都设置为amount+1,当所有的coins都无法拼凑当前金额 i 的时候,dp[i] = amount+1 此时dp[i] 大于amount,所以函数返回-1。

def coinChange(coins,amount):
    dp=[amount+1]*(amount+1)
    dp[0]=0
    for i in range(1,amount+1):
        for j in range(len(coins)):
            if coins[j]<=i:
                dp[i]=min(dp[i],dp[i-coins[j]]+1)
    if dp[amount]>amount:
        return -1
    else:
        return dp[amount]

转载:https://blog.csdn.net/u010420283/article/details/82810278

动态规划——python的更多相关文章

  1. Leetcode OJ : Triangle 动态规划 python solution

    Total Accepted: 31557 Total Submissions: 116793     Given a triangle, find the minimum path sum from ...

  2. 经典动态规划python实现

    1.最长上升子序列 对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui < Ui+1,且A[U ...

  3. 剑指offer-字符串的排列-数组-递归-动态规划-python

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  4. 01背包问题(动态规划)python实现

    01背包问题(动态规划)python实现 在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题, ...

  5. Python 实现 动态规划 /斐波那契数列

    1.斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数 ...

  6. python数据结构与算法第十六天【贪心算法与动态规划】

    对于一个字符串,对字符串进行分割,分割后的每个子字符串都为回文串,求解所有可行的方案 这个问题可以使用贪心算法与动态规划来求解 步骤如下: (1)先得出所有的单个字符的回文串,单个字符必定是回文串, ...

  7. python编写PAT 1007 Maximum Subsequence Sum(暴力 分治法 动态规划)

    python编写PAT甲级 1007 Maximum Subsequence Sum wenzongxiao1996 2019.4.3 题目 Given a sequence of K integer ...

  8. python常用算法(7)——动态规划,回溯法

    引言:从斐波那契数列看动态规划 斐波那契数列:Fn = Fn-1 + Fn-2    ( n = 1,2     fib(1) = fib(2) = 1) 练习:使用递归和非递归的方法来求解斐波那契数 ...

  9. python 动态规划(背包问题和最长公共子串)

    背包问题 现在要往一个可以装4个单位重量的背包里怎么装价值最高:A重量1个单位,价值15:B重量3个单位,价值20:C重量4个重量,价值30 使用动态规划填充空格 class SolutionBag: ...

随机推荐

  1. jqweui Popup 使用说明

    使用步骤说明: 今天遇到一个问题,无论怎么点击一个图标都不会弹出对应的遮罩层,但是把示列代码拷贝过来又可以正常显示:结果是由于在复制的时候把 # 号弄掉了 错误操作展示: <a href=&qu ...

  2. ffmpeg.编译(20191129)

    1.一步步实现windows版ijkplayer系列文章之一——Windows10平台编译ffmpeg 4.0.2,生成ffplay - HarlanC - 博客园.html(https://www. ...

  3. InstallerProjects打包

    C#—使用InstallerProjects打包桌面应用程序   前言 打包桌面应用程序实在是一个不常使用的东西,偶尔使用起来经常会忘东忘西的耽误时间,因此,这篇文章多以图片记录过程,也是用于备忘. ...

  4. JDBC(连接数据库的四个主要步骤)

    JDBC连接数据库 ?创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...

  5. xticks,yticks

    原本的图片如下所示: 如果加上这样的语句: import matplotlib.pyplot as plt plt.xticks([]),plt.yticks([]) 显示结果就为:

  6. poj3630||hdoj1671(字典树)

    题目链接:https://vjudge.net/problem/HDU-1671 题意:给定n个字符串,判断是否存在一些字符串是另一些字符串的前缀. 思路: 套模板,存在前缀可能是两种情况: 当前字符 ...

  7. 【并发】6、借助FQueue 实现多线程生产消费队列

    1.这里先要说一下为什么会想到fqueue,因为这个是一个轻量级的消息队列框架,并且速度很快,用起来很方便,就是这样 当然后期考虑使用redis,这里先上一个fqueue的版本,后面有时间我再吧他改成 ...

  8. python中zipfile模块实例化解析

    文章内容由--“脚本之家“--提供,在此感谢脚本之家的贡献,该网站网址为:https://www.jb51.net/ 简介: zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是 ...

  9. QuartzNet 任务管理系统

    最近有面试!都有问道Quartz方面的问题,之前的项目有使用过,也知道怎么用,但面试时要说出它的原理,一时半会还真说不来!查阅了一些资料先记录下来吧 Quartz.NET官网地址:https://ww ...

  10. 2019年全国高校sql数据库

    2019年全国高校名单sql数据库信息: 根据教育部发布的文件整理形成可用.sql文件,导入数据库即可使用. 包括全国高等学校共计2956所,其中:普通高等学校2688所(含独立学院257所),成人高 ...