数据结构与算法之动态规划算法及其python实现

本文介绍了动态规划算法的基本思想,并通过最长公共子序列和0-1背包问题两个实例详细阐述了动态规划的原理、时间空间复杂度及Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 动态规划问题

动态规划算法和分治法类似,都是将带求解问题分解为若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的答案。与分治法不同的是,动态规划要用一个表来记录所有已解决的子问题的答案。不管该问题是否以后会被用到,只要它被计算过,就将其结果填入表中。在需要时从表中找出答案,避免大量重复计算,从而得到多项式时间算法。通常按一下几个步骤设计动态规划算法:
(1)找出最优解性质,刻画最优解结构;
(2)递归的定义最优值;
(3)以自底向上的方式计算最优值;
(4)根据计算最优值得到的信息,构造最优解。
具体实例有:矩阵连乘,最长公共子序列,流水调度作业,0-1背包问题,最优二叉搜索树等。

2 最长公共子序列

2.1 原理

问题描述:给定两个序列 X = { x1, x2, …, xm }和Y = { y1, y2, …, yn },找出X和Y的最长公共子序列。
最优解:最长公共子序列的长度 m[ i ][ j ]以及相应的位置b[ i ][ j ]。
递归定义最优值:
这里写图片描述
第一种情况:当 i = 0,或者 j = 0 时,长度为 0;
第二种情况:当 xi = yi 时,表示长度等于子序列(去掉 i 位置元素后的序列)+1, 1 表示xi(或者 yi );b[ i ][ j ] = 1
第三种情况:当 xi != yi 时,表示两个不同子序列公共长度的最大值。 b[ i ][ j ]=2,b[ i ][ j ]=3

2.2 时间复杂度和空间复杂度

时间复杂度: 需要计算每个 c[ i ][ j ]的大小,所以时间为 mn;
空间复杂度: 需要存储c[ i ][ j ],所以空间为 mn。

2.3 python代码

#coding:utf-8
def LCS(i,j,X,b,out):   #得到最长子序列
    if i == -1 or j == -1:
        return
    if b[i][j] == 1:
        print i,j
        out.append(X[i])
        LCS(i-1,j-1,X,b,out)
    elif b[i][j] == 2:
        LCS(i-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值