动态规划笔记
鉴于算法考试中遇到了一道动态规划的题目,然而鉴于时间紧张使用了暴力求解,感觉没有掌握动态规划,然后在博客上记录下自己用动态规划解决这道算法题。
题目:
给定一串正数序列\(a_{1}a_{2}...a_{n}\),其中序列中任意一个数均为正数。在该序列中找到最大的比值\(a_{i}\)/\(a_{j}\),其中分子\(a_{i}\)出现的位置索引i在分母\(a_{j}\)出现的位置索引j之后,现找出该最大的比值。
方法一:使用双重循环,在前面找到最小的数,在后面找到最大的数。 (简单)
方法二:使用动态规划:
先简单介绍下动态规划:将一个问题拆解为几个子问题,然后分别求解这些小问题,即最后推断得到最终的大问题。
对于该问题,首先要解决序列为n的整数序列,需要先找到前n-1个序列中最大的比值,再与当前的遍历比值进行比较,进行更新,即可得到最终的答案。
递推关系式如下:
dp[i]=a[i]/min_a 参数说明 a[i]是遍历的序列的值,min_a是目前遍历序列最小的值。
ans = max(ans, dp[i]) ans是记录得到的最大比值,而dp[i]是已遍历序列的最优比值。
具体算法如下:
def max_ratio(a):
n = len(a) # 序列长度
dp = [0] * n # 状态数组
ans = 0 # 全局最大值
min_a = a[0] # 最小值初始化为列表中的第一个元素
for i in range(1, n):
dp[i] = a[i] / min_a
ans = max(ans, dp[i])
min_a = min(min_a, a[i])
return ans

浙公网安备 33010602011771号