Python之动态规划算法

本文介绍了动态规划算法的概念,强调了这种方法适用于解决彼此独立且离散的子问题。动态规划常用于寻找最长公共子串和最长公共子序列。文中通过实例展示了如何利用动态规划求解这两个问题,包括构造矩阵来记录字符串中字符的匹配情况,从而找到最长匹配子串的位置。此外,还讨论了最长公共子序列可能存在的多组相同长度的情况。

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

动态规划算法:
是一种解决棘手问题的方法,它将问题分成小问题,并先着手解决这些小问题。但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用。

在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。

设计动态规划解决方案的通用小贴士:
1、每个动态规划算法都从一个网格开始。
2、单元格中的值通常就是要优化的值。
3、每个单元格都是一个子问题,因此应考虑如何将问题分成子问题,这有助于找出网格的坐标轴。

最长公共子串:
两个字符串都包含的最长连续子串。

最长公共子序列:
两个字符串都包含的最长有序子串。

最长公共子串要求在原字符串中是连续的,而最长公共子序列只需要保持相对顺序一致,并不要求连续。

以下2例中待处理字符串:

# str_a = 'cnbalodgs'
# str_b = 'cbaelodng'

# str_a = 'abcdfg'
# str_b = 'abdfg'

str_a = 'abcbdab'
str_b = 'bdcaba'

# str_a = 'abcbdecb'
# str_b = 'ebdeaba'

示例:获取最长公共子串
解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。

# 此例中有多个相同长度的公共子串,但只能获取第一个子串
def find_lcsubstr(s1, s2): 
	# 下面4行不要直接写在循环中,减少计算
	s1_len = len(s1) + 1 									#为方便后续计算,多了1行1列 
	s2_len = len(s2) + 1
	s3_len =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值