之前初学了一点关于动态规划的知识,但没有系统的学习,最近在空闲时间根据紫书(算法竞赛入门经典)开始了比较有计划的学习,先写下这篇博客,作为笔记。
一、我对动态规划的看法。
动态规划,即是把原问题划分为各个规模更小的问题去解决,原问题的最优解包括了各个子问题的最优解(感觉本质上是分治法)。所以动态规划用于求解最优值,解题过程中最重要的是确定好状态转换方程。对于动态规划的学习,我觉得需要知道的基础概念不多,就是了解了动态规划的想法,然后就是做题训练了,从题目中学习DP才比较有效率。
二、一般的解题思路、步骤。
1、定义状态:一个状态遵循什么规则需要我们自己定义,我们可以通过定义不同的规则来定义不同的状态,但要写出每一个状态的转移方程的难度不同,所以需要我们有目的的筛选,这就需要从题目训练中学习。通过量的累积达到质的变化。
2、判断一个状态有几种可能的决策:在遵循自己对状态所定义的规则的条件下,确保对条件的列举不存在缺漏的情况下,列举出某一状态下可能出现的不同决策,即各种可能的状态转变方向。
3、根据不同的决策列出对应的状态转移方程:状态转移方程需要确保可以得到最优的结果并且对各种可能出现的情形没有漏举的情况。
三、如何定义状态
做了一些题,我发现对状态的定义,我们都是用数组来表示,可能是一维数组,也可能是多维数组。数组的维度根据不同的题目要求而定,有时可以有多解,就是可以用不同维度的数组来解题,但这种情况下一般多维的解题数组可以降维到最简。下面还是通过一些基础、经典的例题来说明。
四、DP例题(一下两题都是紫书的,暂时找不到具体来源)
DAG模型&#