1. 你对动态规划算法的理解(2分)

定义:

与分治法类似,动态规划的思想也是将一个原问题拆分成若干个子问题,而与分治法不同的是这些子问题互相有关联,这种关联是后一个子问题的解依赖前一个子问题的解。动态规划的过程更像是一个多阶段的决策过程,在求解任何一个子问题时(每一个子问题相当于一个阶段),列出各种可能的局部解,通过决策保留那些可能达到最优的局部解,丢弃其他的局部解,依次解决每一个子问题,最后一个子问题的解就是原问题的解。下面我们通过数字三角形这个例子来说明一下这个定义。

给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。

QQ截图20170929023616.jpg

原问题:以7为顶的数字三角形,求它从顶至底的一条最优路径。

拆分成若干个子问题:Max(以3为顶的数字三角形,以8为顶的数字三角形)+7。 这时我们可以发现以3为顶的数字三角形又可以拆分成Max(以8为顶的数字三角形,以1为顶的数字三角形)+3。

一直拆分拆分至最后一行(边界条件)无法再拆分。 

子问题间的关联性:从上一步我们可以看到以3为顶的数字三角形的解依赖以8为顶的数字三角形和以1为顶的数字三角形的解。

而所谓的决策过程:以3为顶的数字三角形又可以拆分成Max(以8为顶的数字三角形,以1为顶的数字三角形)+3,这里每一个子问题我们需要决策保留最大的那个解。

能用动态规划解决的问题所需要具备的条件:

  (1) 最优化原理:每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到

  (2) 无后效性:某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。  

(3)有重叠子问题:子问题之间不是互相独立的,(与分治法不同),一个子问题在下一阶段决策中可能被多次用到。这个条件不是必要条件,但这个条件是动态规划算法的优势所在,节省了大量的时间。

动规解题的一般思路   

 动态规划所处理的问题是一个多阶段决策问题,一般由初始状态(原问题)开始,通过对中间阶段(子问题)决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。

(1)划分阶段:根据问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或是可排序的,否则问题无法求解。

(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。   

(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。  

(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

(注:一般思路选自:https://blog.csdn.net/zw6161080123/article/details/80639932,如有侵权,望告知)

2. 分别列出编程题1、2的递归方程(2分)

           Max(M[ i ],M[ j ]+1)
M[ i ] =  M[ 0 ] = 1                      (0<j<i; 0<=i<n)
M[i]=    Min(r[i][k]+M[k],M[i]);        (0<=i<n; i<k<n)
        r[1][n]                           i=1,k=n
 

 

3. 说明结对编程情况(1分)

  我们有继续进行结对编程!

总结

每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的->动态规划。