实验5 动态规划-最大子段和与最长公共子序列
实验目的:
- 理解动态规划算法的基本思想
- 运用动态规划算法解决实际问题
实验内容:
- 编程实现最大子段和的动态规划算法,并利用实现的算法,求下列子段的最大子段和:-2,10,-5,11,13,-20,25,-10
- 编程实现最长公共子序列的动态规划算法,并使用算法求出如下序列的最长公共子序列
X={1,2,3,4,5,6,7,8} Y={1,3,5,7,8,9}
实验步骤:
#最大子段和
def MaxSum(nums):
dp=[0]*(len(nums)+1)
dp[0]=nums[0]
result=dp[0]
for i in range(1,len(nums)):
dp[i]=max(dp[i-1]+nums[i],nums[i])
result=max(result,dp[i])
return result
nums=[-2,10,-5,11,13,-20,25,-10]
MaxSum(nums)
实验结果:
#最长公共子序列
def lcs(X,Y):
dp=[[0]*(len(Y)+1) for _ in range(len(X)+1)]
for i in range(1,len(X)+1):
for j in range(1,len(Y)+1):
if X[i-1]==Y[j-1]:
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
return dp[len(X)][len(Y)]
X=[1,2,3,4,5,6,7,8]
Y=[1,3,5,7,8,9]
lcs(X,Y)
实验结果:
实验感想:
动态规划的基本思想是将待求解子问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。
动态规划算法的基本要素是最优子结构和重叠子问题。
最优子结构:原问题的最优解包含子问题的最优解。
重叠子问题:用递归算法自顶向下解决动态规划问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算。
备忘录方法:动态规划算法的变形,用表格保存已解决子问题的答案,在下次需要解决子问题时,不用重新计算只需简单地查看该子问题的解答。