DP思想

定义:将一个问题分解为子问题递归求解(小问题按阶段分),并且将中间结果保存以避免重复计算的办法,就叫做“动态规划”。

阶段:运用动态规划首先需要将问题的全过程恰当地划分成若干个相互联系的阶段,以便按一定的次序去求解。阶段的划分一般是根据时间和空间的自然特征来定的,一般要便于把问题转化成多阶段决策的过程

大多数情况下,DP可以用来求最优值,这里要注意,DP求最优值不是递推,而是枚举。要考虑清楚每个阶段,并表示出来。然后寻找终止条件,这里常常把每个阶段的最值保存起来,然后在最值里面求最值。

备忘录方法 :备忘录方法是递归方式的变形。它与动态规划方法一样备忘录方法采用用一个表保存已解决的子问题的答案,而且在计算时间上与动态规划一致,都是O(n^3)。与动态规划不同的是,备忘录方法采用的是自顶向下的递归方式,而动态规划则是采用自下向上的非递归方式。

计算矩阵连乘积的备忘录算法:

int  LookChain()

{

if(m[i][j]>0)return m[i][j];//在调用LookChain之前,数组m要清零,表示对应的子问题还未解决。

if (i==j) return 0;

int u=LookChain(i,i)+LookChain(i+1,j)+p[i-1]*p[i]*p[j];

s[i][j]=i;

for(int k=i+1;k<j;k++)

{

int t=LookChain(i,k)+LookChain(k+1,j)+p[i-1]*p[k]*p[j];

if(t<u){u=t;s[i][j]=k;}

}

m[i][j]=u;

return u;

}

当子问题空间中的部分子问题不必求解时,用备忘录方法则效率较高,因为从其控制结构可以看出,该方法只解那些确实需要求解的子问题。

 

想要用好动态规划,必须得学会转化思考角度,充分利用空间来节省时间。

 

 

posted @ 2013-08-08 14:51  单调的幸福  阅读(1065)  评论(0编辑  收藏  举报