文章目录
1. 何为动态规划
动态规划(Dynamic Programming,DP)
是运筹学的一个分支,是解决多阶段决策过程最优化的一种数学方法,主要用于以时间或地域划分阶段的动态过程的最优化。
常见的动态规划可以分为四大类:
- 线性动态规划
- 区域动态规划
- 树状动态规划
- 背包动态规划
本次主要讲解线性动态规划问题。
2. 动态规划思想
- 为避免重复计算,把前面阶段计算结果临时存储到内存空间(主要采用数组方式)
- 求后面状态时,只需取出前一状态的值,跟其他状态无关。
- 体现了牛求不同阶段子问题,再求最终总问题的解决思路。
即将复杂问题进行分解,通过求解小规模子问题反推出原问题的结果。动态规划适合求解多阶段决策问题的最优解,这些问题必须满足最优化原理和子问题的无后向性。
3. 动态规划的优点
动态规划主要实现了把原先指数级时间复杂度改进为多项式时间夏杂度的算法,解决了重复计算带来的冗余问题,通过数组存储过程结果,以空间换时间的方法,大幅提高了运算时间效率。
4. 求解线性动态规划问题
线性动态规划,指前后状态都只有一个一对一的关系,呈线性的逐步决策过程。
题目描述:
给出文本:ABCABCDEFETO,求该文本的里所含的最长升序字串的长度。要求前面一个英文字母的ASCII码小于后一个英文字母的ASCII码,满足此条件的字符串序列才叫升序序列。
需求规则:
- 给出任意一个英文字母字符串;
- 用动态规划思想求其内最长升序子串
- 把每个英文字母都看作一个阶段;
- 英文字母前面与后面进行比较,前面ASCII码小于当前的,则加1,否则从1开始;
- 把所有的字母都做上一步判断,最后找出最大数,就是最长升序字符串的长度。
图解:
大概思路就是为每个字母赋值为1,只有后面的字母大于前面的字母时才给后面的状态值加1,否则状态值就为1。求出所有的状态值后,状态值最大的就是就是最长升序字符串的长度。
代码实现:
txt1=['A','B','C','A','B','C','D','E','F','E','O','T']
dp=[1,]
len1=len(txt1)
j=0
max1=1
while j<len1-1:
if txt1[j]<txt1[j+1]:
dp.append(dp[j]+1)
if dp[-1]>max1:
max1=dp[-1]
else:
dp.append(1)
j+=1
print('最大子串长度为:%d'%(max1))
运行结果:
程序小结: