每一个学习算法的人最初接触动态规划时都久久不能理解其思想。为了更好的体会动态规划的思想,我推荐以下学习方式学习方式:
首先研究最大连续子序列和,最长递增字串这两个题目,没有必要强行套对着题目套用状态,转换方程之类的,等你熟练了动态规划的思想后那些自动就理解了。关于这两个题目我建议找一张纸对着非递归的步骤一步一步写,看保存状态的数据的变化,写上几步,看一下实际结果和理想的分析方法是否吻合。例如,如果用a[i]表示以第i个元素结尾的最大子数组和,那么这样分析,去试着写出最开始的几步,通过这些步骤去验证这个算法的正确性。
做完以上的题目后,我推荐去看一下算法导论中的矩阵连乘问题,之前的那个问题还属于你当前状态的情况取决于紧邻你的状态和状态转以后也就是新状态之间的比较,通过这个比较来确定最优解,而矩阵连乘这个问题稍微复杂一点,但更好的体现出动态规划的目的“缩小问题规模”,这个问题和之前问题不同在,n的最优解是通过对n-1的所有最优解的组合判断得到的,这让我想到了另一个题,就是二维数组的和最大子矩阵,这个问题的解决,也是通过把二维矩阵变成一维来处理的。