动态规划笔记

鉴于算法考试中遇到了一道动态规划的题目,然而鉴于时间紧张使用了暴力求解,感觉没有掌握动态规划,然后在博客上记录下自己用动态规划解决这道算法题。

题目:

给定一串正数序列\(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
posted @ 2023-02-25 19:33  Charlton_99ing  阅读(25)  评论(0)    收藏  举报