动态规划求解思路

来源:互联网 发布:桌面软件开发语言 编辑:程序博客网 时间:2024/05/22 02:12

递归函数有n个参数,就定义一个n维的数组,数组的下标是递归函数的取值范围,数组函数的值是递归函数的返回值,这样就可以从边界值开始,逐步填充数组,相当于计算递归函数的逆过程

由已知推未知


1.将原问题分解为子问题 然后逐步求解

把原问题分解为若干个子问题,子问题和原问题的形式相同或类似 只不过规模变小 或者可以被求出来

子问题一旦解决 原问题即被解决

子问题的解一旦求出就会被保存,所以每个子问题只需求解一次


2.确定状态

与子问题相关的各个变量的一组取值,我们称为一个状态

一个状态对应一个或多个子问题,所谓某个状态下的值,就是这个状态所对应子问题的解

所有状态的集合 构成问题的状态空间

在数字三角形例子中 有多少个数字就代表有多少个状态

问题的时间复杂度 是状态数目x每个状态时间复杂度


K个整型变量能构成一个状态 如果这K个整型变量的取值范围分别是N1,N2,...Nk, 我们可以用一个K维数组来存储各个状态的值

array[N1] [N2] [N3]...[Nk]

这个状态下的值通常会是一个或多个子问题的解


3初始状态:边界状态的转移:

以数字三角形为例:初始状态就是底边数字(所有底边数字),值就是底边数字的值



4状态的转移:

定义出什么是状态:以及该状态下的值后,就要找出不同状态之间如何迁移

从一个或多个值已知的状态 求出另一个状态的值