动态规划-第一节1:动态规划基本思想框架

Posted 我擦我擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划-第一节1:动态规划基本思想框架相关的知识,希望对你有一定的参考价值。

文章目录

一:动态规划简介

(1)最优化问题

最优化问题:有 n n n个输入,问题解由 n n n个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为约束条件

  • 满足约束条件的解称为问题的可行解(不唯一)
  • 使目标函数取得极值的可行解称之为最优解

这类问题就称之为最优化问题

(2)动态规划基本概念和思想

动态规划:1957年,美国数学家Richard Bellman等人在研究多阶段决策问题的最优性原理中,创建了一种最优化问题求解方法——动态规划。动态规划算法的基本思想和分治法类似,即也将待求解问题分解为若干子问题,但是经分解得到的子问题往往不是相互独立的(也即是相互重叠的),每个子问题是问题求解过程中的一个阶段

分治法在解决适合用动态规划解决的题目时会重复计算公共子问题,效率极低,甚至在求解多项式量级的子问题数目时也可能耗费指数时间

  • 例如斐波那契数列问题就需要重复计算很多公共子问题

动态规划在解决问题时会用一个表保存此阶段子问题的解,当下一求解阶段需要再次计算此子问题时可以通过查表获得该子问题的解而不用再次求解,从而避免了大量重复计算

  • 例如上图斐波那契数列问题,计算 f ( 19 ) f(19) f(19)时就把 f ( 18 ) f(18) f(18) f ( 17 ) f(17) f(17)保存下来,等到 f ( 18 ) f(18) f(18)计算时,直接在表中查找 f ( 17 ) f(17) f(17)即可

最后需要重复一下,动态规划解决的问题一定具有最优子结构的性质。什么是最优子结构呢,举个例子:你们年级有20个班,并且已经知道每个班的最高分,那么全年级成绩最高分是多少?我想在这样的情况下,你肯定不会遍历全年级同学,而是会直接比较每个班的最高分然后得出结论。所以这里 “班级最高”就是“全年级最高”的最优子结构

二:动态规划框架

(1)数学描述

  • 这里我们用一个付款问题(也称“找零钱”问题) 来描述一下动态规划类题目的整体框架

付款问题:超时的POS机要找给顾客货币数量最少的现金

假定POS机中有 n n n张面值为 p i ( 1 ≤ i ≤ n ) p_i(1\\leq i \\leq n) pi(1in)的货币,用集合 P = p 1 , p 2 , . . . , p n P=\\p_1,p_2,...,p_n\\ P=p1,p2,...,pn表示,如果POS机需支付的现金为 A A A问题的输入)。那么它必须从 P P P中选取一个最小子集 S S S,使得

p i ∈ s , ∑ i = 1 m p i = A ( m = ∣ S ∣ ) p_i\\in s,\\quad\\sum\\limits_i=1^mp_i=A(m=|S|) pis,i=1mpi=A(m=S)

  • 这是问题的可行解

如果用向量 X = ( x 1 , x 2 , . . . , x n ) X=(x_1, x_2,...,x_n) X=(x1,x2,...,xn)解向量)表示 S S S中选取货币的结果,则

x i = 1 p i ∈ S 0 p i ∉ S x_i=\\left\\ \\beginaligned 1 & \\quad p_i\\in S \\\\ 0 & \\quad p_i\\notin S \\\\ \\endaligned \\right. xi=10piSpi/S

  • 这是可行解表现形式

那么POS机支付的现金必须满足

∑ i = 1 m p i = A \\sum\\limits_i=1^mp_i=A i=1mpi=A

  • 这是问题的约束条件

并且

d = m i n ∑ i = 1 m p i d=min\\sum\\limits_i=1^mp_i d=mini=1mpi

  • 这是问题的目标函数

(2)代码描述

动态规划论题目五花八门,但如果你做得多了,你会发现这类题目的代码具有一个特点,那就是多重for循环

# 初始化“最简单情况”
dp[0][0][...]=base case;
# 状态转移
for 状态1 in 状态1 的所有取值
	for 状态 2 in 状态2的所有取值
		for...
			dp[状态1][状态2][...]=求最值(选择1,选择2...);

三:动态规划算法步骤

动态规划算法步骤:动态规划算法会涉及如下三个基本要素,写动态规划算法的过程就必须对这三个要素逐个击破

其中重叠子问题和最优子结构相对来说比价容易解决,而 状态转移方程直接决定了你是否可以做出相应的题目,所以在写状态转移方程前你一定要思考以下几点

  • 这个问题的最简单情况是什么
  • 这个问题有什么状态
  • 对于每个状态,可以做出什么选择使得状态发生改变
  • 如何定义dp数组(动态规划数组,也即上文中说的表) 来表现状态和选择

以上是关于动态规划-第一节1:动态规划基本思想框架的主要内容,如果未能解决你的问题,请参考以下文章

动态规划-第一节3:动态规划之使用“找零钱”问题说明最优子结构如何解决

动态规划-第一节2:动态规划之使用“斐波那契数列”问题说明重叠子问题如何解决

动态规划(上)

动态规划基本思想

floyd算法 是动态规划的思想吗

『嗨威说』算法设计与分析 - 动态规划思想小结(HDU 4283 You Are the One)